<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Amon Olimov's blog]]></title><description><![CDATA[Amon Olimov's blog]]></description><link>https://olimov.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 02 Nov 2026 04:47:48 GMT</lastBuildDate><atom:link href="https://olimov.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Katta O notatsiyasi. Algoritmlarning effektivligi qanday o'lchanadi?]]></title><description><![CDATA[Big O notation - katta O metodi, bu algoritmni bajariladigan amallar soni bilan baholash metodi. Dastur yoki algoritmlarni bajarishda turli xil…]]></description><link>https://olimov.hashnode.dev/katta-o-notatsiyasi-algoritmlarning-effektivligi-qanday-olchanadi</link><guid isPermaLink="true">https://olimov.hashnode.dev/katta-o-notatsiyasi-algoritmlarning-effektivligi-qanday-olchanadi</guid><category><![CDATA[algorithms]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Amon Olimov]]></dc:creator><pubDate>Tue, 20 Apr 2021 05:17:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1618950929099/p7L_IxBG-.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Big O notation - katta O metodi, bu algoritmni bajariladigan amallar soni bilan baholash metodi. </p>
<p>Dastur yoki algoritmlarni bajarishda turli xil kompyuterning holatiga qarab xotira va vaqt sarfi turli xil chiqadi, bu bilan ularni taqqoslashni abstrakt qiladi. Shu sababli katta O notatsiyasi usuli bilan dastur kodi yoki ishlash prinsipiga asosan kiruvchi ma'lulotlarni turlicha berib ko'rib uning rasmdagi kabi grafigi yuzaga keltiriladi.</p>
<p>Bu oddiy matematikaga o'xshaydi, lekin qiziqroq. Bu metodda algoritmning mayda amallariga e'tibor bermasdan, asosiy qismida nechta amal bajarilayotganini sanash xolos.</p>
<p>Shunga qarab algoritm effektivligi bahosi chiqariladi.</p>
<p>Masalan:
O(1) - bittagina amal bajarilsa:</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">print_first_item</span>(<span class="hljs-params">items</span>):</span>
    <span class="hljs-keyword">print</span> items[<span class="hljs-number">0</span>]
</code></pre><p>O(n) - ya'ni chiziqli bajarildigan funksiya:</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">print_all_items</span>(<span class="hljs-params">items</span>):</span>
    <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> items:
        <span class="hljs-keyword">print</span> item
</code></pre><p>Bu misollarda <em>n</em> kiruvchi elementlar soni, bu integer, object, map yoki string bo'lishidan qat'iy nazar</p>
<p>O(n^2) - n - elementlar soni deb qaralsa loop ikki marta ichma-ich ishlaganda n^2 ta amal bajariladi:</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">print_all_possible_ordered_pairs</span>(<span class="hljs-params">items</span>):</span>
    <span class="hljs-keyword">for</span> first_item <span class="hljs-keyword">in</span> items:
        <span class="hljs-keyword">for</span> second_item <span class="hljs-keyword">in</span> items:
            <span class="hljs-keyword">print</span> first_item, second_item
</code></pre><p><strong>Aksar vaziyatlarda konstanta(son)larni chiqarib tashlaymiz(yoki yaxlitlaymiz). Masalan quyidagi holatda </strong>
O(2n) bo'lishiga qaramasdan O(n) deb baholanadi:</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">print_all_items_twice</span>(<span class="hljs-params">items</span>):</span>
    <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> items:
        <span class="hljs-keyword">print</span> item

    <span class="hljs-keyword">for</span> item <span class="hljs-keyword">in</span> items:
        <span class="hljs-keyword">print</span> item
</code></pre><p>yoki mana bu vaziyatda ham O(1+n/2+100)  bunday ifodalanadi: O(n)</p>
<pre><code>def print_first_item_then_first_half_then_say_hi_100_times(items):
    <span class="hljs-keyword">print</span> items[<span class="hljs-number">0</span>]

    middle_index = len(items) / <span class="hljs-number">2</span>
    <span class="hljs-keyword">index</span> = <span class="hljs-number">0</span>
    <span class="hljs-keyword">while</span> <span class="hljs-keyword">index</span> &lt; middle_index:
        <span class="hljs-keyword">print</span> items[<span class="hljs-keyword">index</span>]
        <span class="hljs-keyword">index</span> += <span class="hljs-number">1</span>

    <span class="hljs-keyword">for</span> <span class="hljs-keyword">time</span> in xrange(<span class="hljs-number">100</span>):
        <span class="hljs-keyword">print</span> <span class="hljs-string">"hi"</span>
</code></pre><p>chunki <em>n</em> kattalashgani sari 100 soni o'rniga boshqa son bo'lishi mumkin.</p>
<p><strong>Past ahamiyatga ega qismlar inobatga olinmaydi</strong>
Masalan</p>
<pre><code><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">print_all_numbers_then_all_pair_sums</span>(<span class="hljs-params">numbers</span>):</span>
    <span class="hljs-keyword">print</span> <span class="hljs-string">"these are the numbers:"</span>
    <span class="hljs-keyword">for</span> number <span class="hljs-keyword">in</span> numbers:
        <span class="hljs-keyword">print</span> number

    <span class="hljs-keyword">print</span> <span class="hljs-string">"and these are their sums:"</span>
    <span class="hljs-keyword">for</span> first_number <span class="hljs-keyword">in</span> numbers:
        <span class="hljs-keyword">for</span> second_number <span class="hljs-keyword">in</span> numbers:
            <span class="hljs-keyword">print</span> first_number + second_number
</code></pre><p>bu yerda O(n+n^2) ta amal bajariladi, lekin O(n^2) deb olinadi.
Quyidagilar ham qisqaroq qilib ifodalanadi</p>
<ul>
<li>O(n3+50n2+10000) -&gt; O(n^3)</li>
<li>O((n+30)∗(n+5)) -&gt; O(n^2)</li>
<li>O(n2/2+100n) -&gt; O(n^2)</li>
</ul>
<p>buning sababi n kattalashgani sari, formuladagi n ning ahamiyati pasayib n^2 yoki n^3 dan uzoqlashaveradi. Shuning uchun uni chopish mumkin :)</p>
<p><strong>Algoritmning eng past ko'rsatkichi uning bahosi hisoblanadi</strong></p>
<p>Aytaylik biror sorting(saralash) algoritmi <em>n</em> ta sonni 1 ta amal bilan tartiblashi eng yaxshi holat, lekin eng yomon holatda bu algoritm <em>n</em> ning kvadraticha amal bajarishi mumkin(<em>n</em>^2). Bu holatda algoritmning bahosi O(n^2).</p>
<p>Bu metod ba'zi manbaalarda asymptotic analysis deb ham yuritiladi, buning sababini esa rasmdan ko'rishingiz mumkin. Sizning vazifangiz berilgan masalaga qiladigan yechimingiz asimptotasi iloji boricha yashil hududga yaqin yoki yashil hududda bo'lishi kerak.</p>
<ul>
<li>Masala: 1 dan 5050 gacha bo'lgan sonlarning yig'indisini toping.</li>
</ul>
<p>Yechim #1: Tsikl operatorlaridan foydalanib <em>n</em>(n=5050) ta amal bajarish -&gt; O(n)
Yechim #2: Matematik formulasini topib  1 ta amal bilan bajarish -&gt; O(1)</p>
<p>Yaxshi injener(dasturchi) dasturni har doim optimallashtirish haqida o'ylashi kerak. Optimizatsiyada vaqt va xotira resurslari proporsional. Shu sabab vaziyatga qarab optimallashtirgan ma'qul. 
Jamoa a'zolari turli xil darajada bo'lsa yoki keyinchalik kodni qayta o'qish talab qilingan paytda optimallashtirishga qattiq berilib ketmaslik ham ma'qul.</p>
]]></content:encoded></item></channel></rss>