Asosiy mazmunga o'tish

C++ ga bir qarash

4-darajaPlatina — dinamik programmalash25–32 darslar

Bu darsdan keyin siz

  • Python qayerda yetarli, qayerda yetmasligini raqam bilan bilasiz
  • C++ ning uchta asosiy farqini taniysiz
  • qachon tilni almashtirish kerakligi haqida ongli qaror qabul qilasiz

Bu modul Python’da yozilgan va shunday qoladi. Python’da algoritmni o’rganish osonroq: kod qisqa, sintaksis xalaqit bermaydi va fikr ko’rinib turadi.

Lekin xalqaro olimpiadada (IOI va unga olib boradigan bosqichlarda) qatnashchilarning katta qismi C++ yozadi. Sabab bitta va u oddiy: tezlik.

Sig‘adimi?

Bir soniyada taxminan 10⁸ oddiy amal bajariladi.

Yechimn = 10⁶n = 10⁷n = 10⁸
C++ (taxminan)n10⁶sig‘adi10⁷sig‘adi10⁸sig‘adi
Python (taxminan 10 barobar sekin)n log n10⁷sig‘adi10⁸chegarada10⁹sig‘maydi

Yashil — yechim o‘tadi. Sariq — chegarada, konstanta va til muhim bo‘lib qoladi. Qizil — bu yechim bilan bormaydi, boshqasini qidiring.

Jadval qo’pol, lekin nisbat to’g’ri: bir xil algoritm Python’da odatda 10 dan 50 barobargacha sekin ishlaydi. 10⁸ amal C++ da bir soniya, Python’da esa bir necha daqiqa bo’lishi mumkin.

Python o’zgaruvchining turini o’zi aniqlaydi va u ishlash paytida o’zgarishi mumkin. C++ da tur oldindan yoziladi va o’zgarmaydi — shuning uchun kompilyator kodni mashina buyruqlariga to’g’ridan-to’g’ri o’giradi.

turlar
int n = 5;long long katta = 1000000000000;double kasr = 2.5;string ism = "Aziza";vector<int> sonlar = {4, 2, 7};

Python kodni qatorma-qator o’qib bajaradi. C++ da esa kod avval butunlay mashina tiliga o’giriladi, keyin ishga tushadi. Shuning uchun xato turlari ham boshqacha: ko’p xato kompilyatsiya paytida chiqadi, ya’ni programma ishga tushishidan oldin.

Ma’nosi bir xil, nomi boshqa. Bu jadval yod olish uchun emas — kerak bo’lganda ochib qarash uchun.

Python C++ Nima
list vector o’zgaruvchan uzunlikdagi ro’yxat
dict map yoki unordered_map kalit — qiymat
set set yoki unordered_set to’plam
deque deque ikki tomonlama navbat
heapq priority_queue uyum
bisect_left lower_bound ikkilik qidiruv
sorted() sort() saralash

Darsdagi eng oddiy masala — ro’yxatdagi eng katta son. Ikki yechim yonma-yon.

eng-katta.py
import sysmalumot = sys.stdin.buffer.read().split()n = int(malumot[0])a = [int(x) for x in malumot[1 : 1 + n]]print(max(a))
eng-katta.cpp
#include <bits/stdc++.h>using namespace std;int main() {  ios::sync_with_stdio(false);  cin.tie(nullptr);  int n;  cin >> n;  vector<int> a(n);  for (int i = 0; i < n; i++) cin >> a[i];  cout << *max_element(a.begin(), a.end()) << endl;}

To’rtinchi va beshinchi qatorlar — olimpiadada deyarli har faylning boshida turadigan ikki sehrli qator. Ular kirish-chiqishni tezlashtiradi va ularsiz C++ ning o’zi ham sekin bo’lib qoladi.

kompilyatorcompiler

Manba kodni mashina buyruqlariga o’giruvchi programma. C++ kodi ishga tushishidan oldin albatta kompilyatsiya qilinadi.

Qoida sodda. Yechimingiz to’g’ri, algoritmi ham to’g’ri, lekin vaqt chegarasidan o’tmayapti — va uni tezlashtirishning boshqa yo’li qolmagan. Faqat shundagina til almashtiriladi.

Amalda bu shuni bildiradi: 1–3-darajadagi masalalarning deyarli hammasi Python’da o’tadi. 4-darajadan boshlab ba’zi masalalarda chegaralar Python’ni siqib qo’yadi, 5-darajada esa bu odatiy holga aylanadi.

1Nega olimpiadada C++ ko'p ishlatiladi?

Javobni ko'rish

Tezlik. Bir xil algoritm Python’da odatda 10–50 barobar sekin ishlaydi, eng yuqori bosqichlarda esa chegaralar aynan shu farqni hisobga olib qo’yiladi.

2C++ da int va long long farqi nima?

Javobni ko'rish

int taxminan 2·10⁹ gacha son saqlaydi, long long esa 9·10¹⁸ gacha. Chegaradan oshsa int xato bermaydi — jimgina noto’g’ri son beradi.

3Python'ning bisect_left funksiyasi C++ da nima deb ataladi?

Javobni ko'rish

lower_bound. Ma’nosi bir xil: saralangan ketma-ketlikda berilgan qiymatdan kichik bo’lmagan birinchi element.

4Qachon Python'dan C++ ga o'tish kerak?

Javobni ko'rish

Algoritm to’g’ri, uni tezlashtirishning boshqa yo’li qolmagan va yechim baribir vaqt chegarasidan o’tmayotgan bo’lsa. Bundan oldin emas.

5ios::sync_with_stdio(false) nima qiladi?

Javobni ko'rish

C++ ning kirish-chiqishini C tilinikidan ajratadi va shu bilan uni sezilarli tezlashtiradi. Katta kirishli masalalarda bu qator ballga ta’sir qiladi.

Topshiriq — darajangizni tanlang

Asos · 5–7-sinf — Vizual va aniq ko'rsatmali

Yuqoridagi jadvalni daftaringizga ko’chiring. Keyin oldingi darslarda yozgan uchta yechimingizni oling va har birida qaysi Python vositalari ishlatilganini, ularning C++ dagi nomini yozib chiqing.

Mustahkam · 8–9-sinf — Matnli masala, o'zingiz tuzasiz

Bitta oddiy masalani (masalan 01-eng-katta) C++ da yozib ko’ring va uni onlayn kompilyatorda ishga tushiring. Birinchi urinishda qanday xatolar chiqdi?

Chuqur · 10–11-sinf — Algoritmik, chegara holatlari bilan

Bir xil algoritmni ikki tilda yozing va n = 10⁷ da vaqtini o’lchang. Nisbat qancha chiqdi? Keyin Python yechimini tezlashtirishga urinib ko’ring (sys.stdin.buffer, ro’yxat tushunchalari) — nisbat qanchaga o’zgardi?