Bitli amallar. Ikkilik perebor. Rekursiv perebor.

Slides:



Advertisements
Similar presentations
For(int i = 1; i
Advertisements

Class Scope class Student { private: string id; string firstName, lastName; float gpa; public: void Read() { cin >> id >> firstName >> lastName >> gpa;
C++ Basics March 10th. A C++ program //if necessary include headers //#include void main() { //variable declaration //read values input from user //computation.
1 Class Vehicle #include #define N 10../.. 2 Class Vehicle class vehicle { public: float speed; char colour[N+1]; char make[N+1];
Elektr zaryadi. O’tkazgichlarda elektr zaryadlarining taqsimlanishi
D.I.Mendeleyevning elementlar davriy sistemasi
1 11/05/07CS150 Introduction to Computer Science 1 Functions Chapter 6, page 303.
#include using namespace std; void main() { int a[3]={10,11,23}; for(int i=0;i
y=aх² funksiya Х У Х У Х Х У Х Х У У У Grafiklar qaysi funksiyalarga tegishli:
MINISTRY OF HIGHER AND SECONDARY SPECIALIZED EDUCATION OF THE REPUBLIC OF UZBEKISTAN FERGHANA POLYTECHNIC INSTITUTE FACULTY OF CONSTRUCTION Presentation.
Microsoft Internet Explorer dasturida ishlash Toshkent Copyright © 2000 IATP Site design by Makhmud BotirovMakhmud Botirov EN GRANT IATP II&IS UZ.
M. Taimoor Khan #include void main() { //This is my first C++ Program /* This program will display a string message on.
TOSHKENT TIBBIYOT AKADEMIYASI Umumiy va radiatsion gigiena kafedrasi
1 Lecture 04 Structural Programming in C++ You will learn: i) Operators: relational and logical ii) Conditional statements iii) Repetitive statements.
1 Simple Input/Output  C++ offers the iostream library, which defines a system of character-oriented Input/Output (I/O) using object oriented programming.
QORA TUYNUKLAR , NEYTRON YULDUZLAR, GRAVITASION TO’LQINLAR
Ддллралралдп Presentation of practical lessons on environmental sanitation for 4th year 8 - semester.
Lecture 4 Function example. Example1 int max (int a, int b) { int c; if (a > b) c = a; else c = b; return (c); } void main ( ) {int x, y; cin>>x>>y; cout.
Mualliflar: P.F.Hasanov, R.I.Isayev, X.P.Hasanov
Strings program. C Program to Check if a given String is Palindrome #include void main() { char string[25], reverse_string[25] = {'\0'}; int i, length.
Strings program. C Program to Check if a given String is Palindrome #include void main() { char string[25], reverse_string[25] = {'\0'}; int i, length.
1 Advanced Programming Examples Output. Show the exact output produced by the following code segment. char[,] pic = new char[6,6]; for (int i = 0; i
Turkistonlik ulug' alloma abu Rayhon Beruniy ota-onasidan juda yosh yetim qolgan va Iroqiylar xonadonida tarbiyalangan. Iroqiylarning oxirgi vakili.
Print Row Function void PrintRow(float x[ ][4],int i) { int j; for(j=0;j
INTERNETGA ULANISH, XIZMAT BAHOSI Toshkent Copyright © 2000 IATP Site design by Makhmud BotirovMakhmud Botirov EN GRANT IATP II&IS UZ IATP GRANTI.
Web sahifalar yaratish Microsoft FrontPage Express
 Learn how to form strings using one-dimensional array  String manipulation functions:  strcpy  strrev  strcmp  Program using strings.
Int fact (int n) { If (n == 0) return 1; else return n * fact (n – 1); } 5 void main () { Int Sum; : Sum = fact (5); : } Factorial Program Using Recursion.
Intro. to Computer Programming Eng. Nehal A. Mohamed Spring Semester-2016.
3.1. KOMPYUТERNING ARХIТEKТURASI VA ASOSIY QURILMALARI
Amerika mustaqillik uchun kurash Reja: 1.Mustaqillik urushining sabablari 2.Mustaqillik urushining boshlanishi 3.Mustamlakalarning Angliyadan ajralib chiqishi.
Hozirgi vaqtda Yer sharini qoplagan o'simliklarning asosiy qismini yopiq urug'li o'simliklar tashkil qiladi. Yopiq urug'lilar o'simliklar olamining boshqa.
«Dаvоlаsh fаkultetining fаkultet vа gоspitаl tерrаpiya, tibbiy profilaktika fаkultetining ichki kasalliklar kafedrasi» Gоspitаl tерrаpiya Nefrotik sindrom.
Tabiatshunoslik va geografiya fakulteti, Geografiya va IBA yo`nalishi, 3-bosqich talabalari uchun Markaziy Osiyo geografiyasi fanidan QOZOG`ISTON RЕSPUBLIKASI.
Sílabas con m,p,s tema 2. pe so ma si mu se.
o’qituvchisi Yulbarsoa Hilola
Sum of natural numbers class SumOfNaturalNumbers {
C/C++: type sizes in memory pointers
BU IERARXIYADA LOKAL TARMOQLARGA QANDAY O‘RIN AJRATILADI? “LOKAL TARMOQLAR” (LAN, LOCAL AREA NETWORK) DEGANDA AYNAN SHUNDAY TARMOQLARNI TUSHINILADIKI,
EN GRANT IATP II&IS UZ IATP GRANTI II va AH ELEKTRON POCHTA ( )
C++ Arrays.
לולאות קרן כליף.
Solve traffic congestion Group Absalomov O’tkir Abdusattorov Shaxboz.
BIOORGANIK VA BIOLOGIK KIMYО KAFEDRASI Biologik kimyo 2-KURS Xujayra membranalarining tuzilishi. Modda almashinuviga kirish. Ma’ruzachilar: professorlar:
“Informatika va axborot texnologiyalari” fani
Introduction to Programming and the C Language
Programming -2 برمجة -2 المحاضرة-5 Lecture-5.
Function User defined function is a code segment (block) that perform an specific action and may return a value. Function Definition: Return_DT F_name.
Dunyoning oliy toifali zanjir mehmonxonalari
Conditional Construct
O’qituvchi kelajak bunyodkori!
Sequential input and output Operations in file
КОМПЬЮТЕР БИЛАН ИШЛАШ. РЕЖА:  Компьютерни ишга тушуриш;  Windows операцион тизими;  Файллар билан ишлаш;  Windows стандарт дастурлари билан ишлаш;
Mavzu: Kompyuter tarmoqlarini adreslash. Reja: Mavzu: Kompyuter tarmoqlarini adreslash. Reja:
Keywords variance analysis – dispersion tahlil, correlation analysis – korrelyatsion tahlil, general dispersion – umumiy dispersiya, factorial dispersion.
Tibbiy va biologik kimyo kafedrasi Biologik kimyo 2 kurs Biologik kimyo faniga kirish. Oqsillar biologik faolligining ularning fazoviy konfiguratsiyasiga.
Innovatsiya tushunchasi, innovatsiyalarning tasnifi. Innovatsion loyihani shakllantirish va uning bajarilish bosqichlari Reja:. “Innovatsiya” tushunchasi.
Toshkent Axborot Texnologiyalari Universiteti
Pascal ABC da chizmalarning harakatlanishi
CS 1430: Programming in C++.
O‘ZBEKISTON RESPUBLIKASI OLIY VA O‘RTA MAXSUS TA’LIM VAZIRLIGI
Fe`l - فعل Tayyorladi: Saidova D..
Merge Sort.
Т А Қ Д И М О Т И Жураева Холисхоннинг Наманган
CS150 Introduction to Computer Science 1
Fundamental Programming
Introduction to Algorithms and Programming COMP151
Pointers.
Тожибоева Махлиё 402-гурух
NAMANGAN MUHANDISLIK- TEXNOLOGIYA INSTITUTI YST FAKULTETI
Presentation transcript:

Bitli amallar. Ikkilik perebor. Rekursiv perebor. Tayyorladi: Azat Yusupov. Tatu Urganch filiali 1-kurslar tayyorgarligi, 7-dars, 20.05.2014

Reja: Ikkilik sanoq sistemasi. Bitli amallar. Ikkilik perebor. Uchlik perebor. Rekursiv ikkilik perebor.

Ikkilik sanoq sistemasi Kompyuterda bajariladigan barcha arifmetik amallar ikkilik sanoq sistemasida bajariladi. Sonlar avval ikkilik sanoq sistemasiga o’tiriladi va har bir biti bo’yicha amal bajariladi. Bit sonning ikkilik sanoq sistemasidagi bitti razryadini ifodalaydi. U 0 yoki 1 ga teng bo’lishi mumkin. C++ da int tipidagi sonlarni ifodalash va ular ustida amallar 32 razriyad bo’yicha bajariladi. Masalan 1234025 soni ikkilik sanoq sistemasida 100101101010001101001 ga teng.

32 razryadga to’ldirsak: 00000000000100101101010001101001 Razryad nomerlari 0 dan 30 gacha oxiridan boshlab nomerlana- di. Masalan qizil rangli bit 6-bit hisoblanadi. Sonni ikkilik sanoq sistemasiga o’tirish. Sonni to u nol bo’lmagunga qadar ikkiga bo’lgandagi qoldiqni olib boramiz va uni teskari tartibda biror satrga qo’shib boramiz. int main() { int n; cin>>n; string s = ""; while (n > 0) { s = (char)(n % 2+48)+s; n /= 2; } cout<<s; return 0;

Topshiriq: dastur kodida kichik hato bor Topshiriq: dastur kodida kichik hato bor. Uni toping, aks holda 608-masalada WA#8 olasiz. 2 likdan 10 likga o’tish uchun ikkinin darajalari bo’yicha qo’shib chiqamiz. Har bir bit o’z nomeridagi 2 ning darajasiga ko’paytiriladi. Masalan 1001101 = 1*26+0*25+0*24+1*23+1*22+0*21+1*20=77. string s; cin>>s; int result = 0, pow_two = 1; for (int i = s.length()-1; i >= 0; i--) { result += (s[i]-48) * pow_two; pow_two *= 2; } cout<<result;

Bitli amallar Kompyuter ikkilik sanoq tizimida bitlar bilan ishlagan uchun bitli amallar tez bajatiladi. Bitli amallar unar va binar amallar bo’lishi mumkin. Unar amal bir son ustida bajarilsa, binar amal ikki son ustida bajariladi. Unar amallar. 1) Ikkining darajasiga bo’lish yoki o’ngga siljitish amali. x >> t; Bu amalda x sonini 2t ga bo’lish bajariladi. Ikkilik sanoq sitemasida bu oxiridagi t dona bitni olib tashlashni bildiradi.

Masalan 26 sonini 22 ga bo’lish uchun 26 ikkilikda 11010 ga teng Masalan 26 sonini 22 ga bo’lish uchun 26 ikkilikda 11010 ga teng. Oxirgi 2 bitni o’chirsak 110->6. x=x>>t yoki qisqa yozishda x >>= t; 2) 2 ning darajasiga ko’paytirish yoki chapga siljitish amali.Ikkining darajasiga ko’paytirish uchun ikkilik sanoq sistemasida sonning daraja qancha bo’lsa shuncha nol qo’shamiz. Masalan 25 ikkilikda 11001 uni 23 ga ko’paytirsak 11001000=200. Yozilishi: x<<t. X=X<<t; X <<= t; 2n=1<<n;

Binar amallar 1) & (and) amali. Birinchi sonning har bir biti ikkinchi sonning mos biti bilan taqqoslanadi. Natijaviy bit qiymati ikkita bit ham 1 ga teng bo’lganda 1 ga teng bo’ladi. 1 & 1 = 1, 0 & 0 = 0, 1 & 0 = 0, 0 & 1 = 0; Masalan: 45078 = 01011000000010110 & 78574 = 10011001011101110 12294 = 00011000000000110 Yozilishi: (45078 & 78574 );

2) | (or) amali. Birinchi sonning har bir biti ikkinchi sonning har bir biti bilan taqqoslanadi. Kamida bitta bitning qiymati 1 ga teng bo’lsa natijaviy bit 1 ga teng bo’ladi. 0 | 0 =0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 =1; Masalan: 45078 = 01011000000010110 | 78574 = 10011001011101110 111358 = 11011001011111110 Yozilishi: (45078 | 78574 );

2) ^ (xor) amali(ikkining moduli bo’yicha qo’shish) 2) ^ (xor) amali(ikkining moduli bo’yicha qo’shish). Birinchi sonning har bir biti ikkinchi sonning har bir biti bilan taqqoslanadi.Agar ikkita bitning qiymatlari har xil bo’lsa 1 ga, bir xil bo’lsa 0 ga teng bo’ladi. 0 | 0 =0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 =0; Masalan: 45078 = 01011000000010110 ^ 78574 = 10011001011101110 99064 = 11000001011111000 Yozilishi: (45078 ^ 78574 );

Sonning i-bitining qiymatini aniqlash Sonning i-bitining qiymatini aniqlash uchun unin 2i bilan & amlini hisoblaymiz. Masalan 78574 =10011001011101110 ning 3-bitini aniqlash uchun 10011001011101110 & =00000000000001000 00000000000001000 4-bitini aniqlash uchun & =00000000000000000 00000000000010000

i-bitini o’zgartirish.0 bo’lsa 1 ga, 1 bo’lsa 0 ga. If ((mask & (1 << i)) != 0) i-bit birga teng; else i-bit nolga teng; i-bitini o’zgartirish.0 bo’lsa 1 ga, 1 bo’lsa 0 ga. i-bitini o’zgartirish uchun (1 << i) bilan ^ (xor) amali bajaramiz; 3-bitini aniqlash uchun 10011001011101110 ^ = 10011001011100110 00000000000001000 4-bitini o’zgartirganda ^ = 10011001011111110 00000000000010000

i-bitini 1 ga aylantirish i-bitini 1 ga aylantirish.(0 bo’lsa 1 ga aylantirish, 1 bo’lsa oz’ratirishsiz qoldirish). (mask | (1 << i)). Ikkilik perebor. Ikkilik pereborda eng ko’p qo’llaniladigan pereborlardan biri xisoblanadi. Bizga n ta buyum berilgan. Ulardan har birining og’irlin W[i] massiv ko’rinishida berilgan. Undan shunday buyumlarni olish kerakki, ularning og’irliklari yig’indisi berilgan S soniga teng bo’lsin(1≤n≤20). Masalan n=6, buyumlar og’irliklari 4, 7, 2, 5, 3, 2 bo’lsa, va S=7 o’g’rilikni quyidagicha usullarda olishimiz mumkin; 7, 4+3, 2+5, 5+2, 2+3+2 jami 5 ta usul.

Bizda n ta buyum bor. Biz ulardan tanlash amalga oshirganimzida har bir buyum uchun ikkita variant bor, tanlangan to’plamga tegishliligi yoki tegishli emasligi. n ta razriyadli ikkilik sanoq sistemasida 0 dan 2n-1 gacha bo’lgan sonlarni ikkilikdagi kodida mumkin bo’lgan barcha kombinatsiyalar ko’riladi. Masalan n=3 bo’lsa 0 dan 23-1 gacha sonlarning ikkilik kodlari: 000 100 001 101 010 110 011 111

Har bir kombinatsiyada sonning ikkilik kodidagi mos belgisi 1 ga teng bo’lsa uni tegishli, 0 ga teng bo’lsa tegishli emas deb olamiz. int main() { int n; long long X; cin>>n>>X; int a[n]; for (int i = 0; i < n; i++) { cin>>a[i]; } int ans = 0; for (int mask = 0; mask < (1 << n); mask++) { long long sum = 0; if ((mask & (1 << i)) != 0) sum += a[i]; if (sum==X) ans++; cout<<ans;

Bu usulning ishlash vaqti O(2n n). Demak n≤20 uchun qo’llash mumkin Bu usulning ishlash vaqti O(2n n). Demak n≤20 uchun qo’llash mumkin. Ikkilik pereborni qilishning boshqacha usuli bitli amallar ishlatmasdan, har bir sonni ikkilik sanoq tizimiga o’tkazamiz va har bir belgisini tekshirib chiqamiz:

char w[100]; string s; for (int mask = 0; mask < (1 << n); mask++) { long long sum = 0; itoa(mask, w, 2); s = string(w); while ((int)s.length() != n) s = "0"+s; for(int i = 0; i < n; i++) { if (s[i]=='1') sum += a[i]; } if (sum==X) ans++;

Yana bitta xosil qilish usuli Har bir ikkilik ketma-ketlikni ularni leksikografik jihatdan o’sish tartibida ko’rib borish uchun har bir navbatdagi ketma- ketlikdan keyingi ketma-ketlikni topib borish kerak. Buning uchun oshirish mumkin bo’lgan eng kichik bitni topishimiz kerak, bu 0 ga teng bo’lgan eng kichik razryadli bit. Uning qiymatini 1 qilsak avvalgidan kattaroq son ketma-ketlik hosil bo’ladi, lekin eng kichigi bo’lishi uchun undan keyingi barchasini 0 ga aylantiramiz. Masalan 100101101111 dan keyingisi 100101110000 int bit[n]; for (int i = 0; i < n; i++) { bit[i] = 0; }

while (1) { long long sum = 0; for (int i = 0; i < n; i++) { if (bit[i]==1) sum += a[i]; } if (sum==X) ans++; int pos = -1; for (int i = n-1; i >= 0; i--) { if (bit[i]==0) { pos = i; break; if (pos==-1) bit[pos]++; for (int i = pos+1; i < n; i++) { bit[i] = 0;

Uchlik perebor. Uchlik sanoq sistemasida son 0,1 yoki 2 dan iborat bo’ladi. Masala: Xaridor X sumlik maxsulot sotib olmoqchi, unda n ta, har biridan ikkitadan bo’lgan qiymati a[1], a[2],…a[n] tangalar bor. U necha xil usulda berilagn X sumni xosil qilishi mumkin? Har bir tangadan olmasligi(0) yoki 1 ta olishi, yoki 2 ta olishi mumkin. Uchli sanoq sistemasidagi mumkin bo’lgan kombinat- siyalari soni 3n . Bu qiymatini pow() funksiyasisiz topish kerak. char c[100]; string s; int pow = 1; for (int i = 1; i <= n; i++) { pow *= 3; }

for (int mask = 0; mask < pow; mask++) { long long sum = 0; itoa(mask, c, 3); s = string(c); while ((int)s.length() != n) s = "0"+s; for(int i = 0; i < n; i++) { sum += w[i] * (s[i]-48); } if (sum==X) ans++; cout<<ans;

Ikkilik rekursiv perebor. Uchlik pereborni ham ikkilik perebordagi kami har safar keyingi ketma-ketlikni topib borish mumkin. Oshirish mumkin bo’lgan eng kichik (0 yoki 1)razriyadni topamiz, uni birga oshiramiz, undan keyingilarining barchasini 0 ga aylantiramiz. Ikkilik rekursiv perebor. Barcha ikkilik ketma ketliklarni rekursiv hosil qilish ham mumkin.

int a[100]; int n; void go(int pos) { if (pos==n) { for (int i = 0; i < n; i++) { cout<<a[i]; } cout<<"\n"; return; a[pos] = 0; go(pos+1); a[pos] = 1; int main() { cin>>n; go(0);

pos 1 1 1 1

0 bo’lsa chapga, 1 bo’lsa ongga tamon davom etadi. Daraxt ko‘rinishida: 0 bo’lsa chapga, 1 bo’lsa ongga tamon davom etadi. a0 1 a1 1 1 a2 1 1 1 1 a3 1 1 1 1 1 1 1 1

Endi rekursiyasiz yechilgan ikkilik perebor masalasini rekursiv yechamiz. Bizda ikkita parametr kerak bo’ladi: birinchisi joriy pozitsiya, ikkinchisi hozirgi yig’indi. Joriy pozitisyaga 0 qo’yib keyingi holatga o’tishda hozirgi yig’indi o’zgarmaydi, 1 bo’lsa shu pozitsiyadagi songa ortadi. int ans = 0, n, X; int a[1000]; void go(int pos, long long s) { if (pos==n) { if (s==X) ans++; return; }

go(pos+1, s); go(pos+1, s+a[pos]); } int main() { cin>>n>>X; for (int i = 0; i < n; i++) { cin>>a[i]; go(0, 0); cout<<ans;

E’tiboringiz uchun raxmat. Masalalar: algo.urgench-tuit.uz 608-613 E’tiboringiz uchun raxmat. Savollar?