2 ^ i * 5 ^ j से अगले सबसे छोटे को जहाँ मैंने i, j> = 0 प्रिंट किया है


10

मुझे हाल ही में एक तकनीकी फोन स्क्रीनिंग के दौरान यह सवाल पूछा गया था और उसने अच्छा नहीं किया। सवाल नीचे शब्दशः शामिल है।

{2^i * 5^j | i,j >= 0}सॉर्ट किया गया संग्रह जनरेट करें । अगले सबसे छोटे मूल्य को लगातार प्रिंट करें।

उदाहरण: { 1, 2, 4, 5, 8, 10...}

"अगला सबसे छोटा" मुझे लगता है कि एक मिन-हीप शामिल है, लेकिन मुझे वास्तव में नहीं पता था कि वहां से कहां जाना है और साक्षात्कारकर्ता द्वारा कोई सहायता प्रदान नहीं की गई थी।

क्या किसी को इस तरह की समस्या को हल करने की सलाह है?


मुझे लगता है कि साक्षात्कार आपको इसे निरंतर स्मृति में करने के लिए कहना चाहता है। O (n) मेमोरी का उपयोग यह काफी तुच्छ बनाता है। या कम से कम O (logn) मेमोरी का उपयोग कर रहे हैं क्योंकि इनपुट n के लिए एन्कोडिंग आकार लॉगान होगा। स्मृति समाधान के लिए एक O (n) एक घातीय मेमोरी समाधान है।
सूचित

जवाबों:


14

आइए समस्या का समाधान करें: प्रत्येक संख्या को 1 से अनंत तक आउटपुट करें जैसे कि संख्या में 2 और 5 को छोड़कर कोई कारक नहीं है।

नीचे एक सरल C # स्निपेट दिया गया है:

for (int i = 1;;++i)
{
    int num = i;
    while(num%2 == 0) num/=2;
    while(num%5 == 0) num/=5;
    if(num == 1) Console.WriteLine(i);
}

Kilian के / QuestionC के दृष्टिकोण है बहुत अधिक performant। इस दृष्टिकोण के साथ सी # स्निपेट:

var itms = new SortedSet<int>();
itms.Add(1);
while(true)
{
    int cur = itms.Min;
    itms.Remove(itms.Min);
    itms.Add(cur*2);
    itms.Add(cur*5);
    Console.WriteLine(cur);
}

SortedSet डुप्लिकेट सम्मिलन को रोकता है।

मूल रूप से, यह सुनिश्चित करके काम करता है कि अनुक्रम में अगला नंबर है itms

सबूत है कि यह दृष्टिकोण मान्य है:
वर्णित एल्गोरिथ्म यह सुनिश्चित करता है कि फॉर्म में किसी भी संख्या के आउटपुट के बाद 2^i*5^j, सेट में अब शामिल है 2^(i+1)*5^jऔर 2^i*5^(j+1)। मान लीजिए कि अनुक्रम में अगला नंबर है 2^p*5^q। फॉर्म का एक पूर्व आउटपुट नंबर मौजूद होना चाहिए 2^(p-1)*5^(q)या 2^p*5^(q-1)(या दोनों, यदि न तो पी और न ही क्यू 0 के बराबर हैं)। यदि नहीं, तो 2^p*5^qअगला नंबर नहीं है, क्योंकि 2^(p-1)*5^(q)और 2^p*5^(q-1)दोनों छोटे हैं।

दूसरा स्निपेट O(n)मेमोरी का उपयोग करता है (जहां n संख्याओं की संख्या है जो आउटपुट किया गया है), क्योंकि O(i+j) = O(n)(क्योंकि मैं और j दोनों n से कम हैं), और O(n log n)समय में n नंबर पाएंगे । पहला स्निपेट घातीय समय में संख्या पाता है।


1
नमस्ते, आप देख सकते हैं कि मुझे उम्मीद है कि साक्षात्कार के दौरान मैं उलझन में था। वास्तव में, प्रदान किया गया उदाहरण प्रश्न में वर्णित सेट से आउटपुट है। 1 = 2^0*5^0, 2 = 2^1*5^0, 4 = 2^2*5^0, 5 = 2^0*5^1, 8 = 2^3*5^0, 10 = 2^1*5^1
जस्टिन स्काइल्स

उन दोहराया जाता है .Remove()और .Add()कचरा कलेक्टर से बुरा व्यवहार को गति प्रदान करने के लिए जा रहा है, या यह बातें पता लगाने जाएगा?
स्नोबोल्ड

1
@Snowbody: ऑप्स प्रश्न एक एल्गोरिदम प्रश्न है, इसलिए यह कुछ हद तक अप्रासंगिक है। इस बात को नजरअंदाज करते हुए कि आपकी पहली चिंता बहुत बड़े पूर्णांकों के साथ होनी चाहिए, क्योंकि यह कचरा संग्राहक ओवरहेड की तुलना में जल्द ही एक समस्या बन जाती है।
ब्रायन

8

यह एक सामान्य पर्याप्त साक्षात्कार प्रश्न है जिसका उत्तर जानना उपयोगी है। यहाँ मेरी व्यक्तिगत पालना शीट में प्रासंगिक प्रविष्टि है:

  • प्रपत्र 3 की संख्या उत्पन्न करने के लिए एक 5 7 क्रम में , 1 के साथ शुरू, सभी तीन संभावित उत्तराधिकारियों (3, 5, 7) एक सहायक संरचना में सामान, तो अपनी सूची में से सबसे छोटी संख्या में जोड़ें।

दूसरे शब्दों में, आपको इसे कुशलतापूर्वक हल करने के लिए एक अतिरिक्त सॉर्ट किए गए बफर के साथ दो-चरण दृष्टिकोण की आवश्यकता है। (एक अच्छा लंबा विवरण गेल मैकडोवेल द्वारा क्रैकिंग इंटरव्यू में क्रैकिंग में है


3

यहां एक जवाब है जो सीपीयू की कीमत पर निरंतर मेमोरी के साथ चलता है। यह मूल प्रश्न (यानी एक साक्षात्कार के दौरान उत्तर) के संदर्भ में एक अच्छा जवाब नहीं है। लेकिन अगर साक्षात्कार 24 घंटे लंबा है, तो यह इतना बुरा नहीं है। ;)

विचार यह है कि यदि मेरे पास n है जो कि एक मान्य उत्तर है, तो अनुक्रम में अगला n दो की शक्ति से n गुना होने वाला है, जिसे 5 की शक्ति से विभाजित किया जाता है। या फिर n की 5 की शक्ति से विभाजित किया जाता है, दो की शक्ति। बशर्ते यह समान रूप से विभाजित हो। ((या भाजक 1 हो सकता है?) जिस स्थिति में आप सिर्फ 2 या 5 से गुणा कर रहे हैं)

उदाहरण के लिए, 625 से 640 तक जाने के लिए, 5 ** 4/2 ** 7. से गुणा करें, या अधिक, आमतौर पर, 2 ** m * 5 ** nकुछ m के लिए कुछ मान से गुणा करें , जहां एक सकारात्मक है और एक नकारात्मक या शून्य है, और गुणक संख्या को समान रूप से विभाजित करता है।

अब, मुश्किल हिस्सा गुणक पाया जाता है। लेकिन हम जानते हैं कि ए) विभाजक को संख्या को समान रूप से विभाजित करना चाहिए, बी) गुणक एक से अधिक होना चाहिए (संख्या बढ़ती रहती है), और सी) अगर हम सबसे कम गुणक को 1 से अधिक लेते हैं (यानी 1 <एफ <अन्य सभी अन्य एफ) ), तो यह हमारा अगला कदम होने की गारंटी है। उसके बाद का कदम यह सबसे कम कदम होगा।

गंदा हिस्सा मी, एन का मान पा रहा है। केवल लॉग (n) की संभावनाएं हैं, क्योंकि छोड़ने के लिए केवल 2 या 5 के बहुत सारे हैं, लेकिन मुझे राउंडऑफ से निपटने के लिए एक मैला रास्ता के रूप में -1 से +1 का एक कारक जोड़ना पड़ा। इसलिए हमें केवल O (लॉग (n)) प्रत्येक चरण के माध्यम से पुनरावृत्त करना होगा। तो यह ओ (एन लॉग (एन)) समग्र है।

अच्छी खबर यह है, क्योंकि यह एक मूल्य लेता है और अगले मूल्य को पाता है, आप अनुक्रम में कहीं भी शुरू कर सकते हैं। इसलिए यदि आप 1 बिलियन के बाद अगला चाहते हैं, तो यह केवल 2/5 या 5/2 के माध्यम से पुनरावृत्ति करके और 1 से अधिक छोटे गुणक को चुनकर पा सकते हैं।

(अजगर)

MAX = 30
F = - math.log(2) / math.log(5)

def val(i, j):
    return 2 ** i * 5 ** j

def best(i, j):
    f = 100
    m = 0
    n = 0
    max_i = (int)(math.log(val(i, j)) / math.log(2) + 1) if i + j else 1
    #print((val(i, j), max_i, x))
    for mm in range(-i, max_i + 1):
        for rr in {-1, 0, 1}:
            nn = (int)(mm * F + rr)
            if nn < -j: continue
            ff = val(mm, nn)
            #print('  ' + str((ff, mm, nn, rr)))
            if ff > 1 and ff < f:
                f = ff
                m = mm
                n = nn
    return m, n

def detSeq():

    i = 0
    j = 0
    got = [val(i, j)]

    while len(got) < MAX:
        m, n = best(i, j)

        i += m
        j += n
        got.append(val(i, j))

        #print('* ' + str((val(i, j), m, n)))
        #print('- ' + str((v, i, j)))

    return got

मैंने पहले 10,000 की संख्या को मान्य किया था जो कि छांटे गए सूची समाधान द्वारा उत्पन्न पहले 10,000 के खिलाफ उत्पन्न होती है, और यह कम से कम अब तक काम करती है।

एक खरब के बाद BTW अगले एक 1,024,000,000,000 लगता है।

...

हम्म। मैं ओ (एन) प्रदर्शन - ओ (1) प्रति मूल्य (!) - और ओ (लॉग एन) स्मृति उपयोग को best()लुकअप टेबल के रूप में मान सकता हूं कि मैं वेतन वृद्धि का विस्तार करता हूं। अभी यह हर बार पुनरावृत्ति करके स्मृति को बचाता है, लेकिन यह बहुत अधिक अनावश्यक गणना कर रहा है। उन मध्यवर्ती मूल्यों को पकड़कर - और न्यूनतम मूल्यों की एक सूची - मैं डुप्लिकेट कार्य से बच सकता हूं और इसे बहुत तेज कर सकता हूं। हालांकि, मध्यवर्ती मूल्यों की सूची n के साथ बढ़ेगी, इसलिए ओ (लॉग एन) मेमोरी।


बहुत बढ़िया जवाब। मेरे पास समान विचार है कि मैंने कोड नहीं किया है। इस विचार में, मैं 2 और 5 के लिए एक ट्रैकर रखता हूं। यह अधिकतम ट्रैक करेगा nऔर mजिसका उपयोग अब तक अनुक्रम में संख्याओं के माध्यम से किया गया है। प्रत्येक पुनरावृत्ति पर, nया ऊपर mजा सकता है या नहीं। हम एक नई संख्या बनाते हैं और 2^(max_n+1)*5^(max_m+1)फिर इस संख्या को संपूर्ण पुनरावर्ती तरीके से कम करते हैं, प्रत्येक कॉल को 1 से घटाकर तब तक कम करते हैं जब तक कि हम न्यूनतम प्राप्त नहीं करते हैं जो वर्तमान संख्या से बड़ा है। हम अद्यतन max_n, max_mके रूप में की जरूरत है। यह निरंतर मेम है। O(log^2(n))डीपी कैश को कम करने के लिए इस्तेमाल किया जा सकता है, तो याद किया जा सकता है
InformedA

दिलचस्प। यहाँ अनुकूलन यह है कि इसे m & n के सभी युग्मों पर विचार करने की आवश्यकता नहीं है, क्योंकि हम सही m को जानते हैं, n, निकटतम गुणक को 1 में उत्पन्न करेगा। इसलिए मुझे केवल m = -i से max_i तक का मूल्यांकन करने की आवश्यकता है, और मुझे बस n की गणना कर सकते हैं, राउंडऑफ़ के लिए कुछ कचरे में फेंकना (मैं मैला था और सिर्फ -1 से 1 तक पुनरावृत्त हुआ, लेकिन यह अधिक सोच सहन करता है;))।
रोब

हालाँकि, मैं आपकी तरह सोच रहा हूँ ... अनुक्रम निर्धारक होने जा रहा है ... यह वास्तव में एक दिशा में एक बड़े पास्कल के त्रिकोण i + 1 की तरह है और दूसरे में j + 1। तो अनुक्रम गणितीय रूप से निर्धारक होना चाहिए। त्रिभुज में किसी भी नोड के लिए, हमेशा एक गणितीय रूप से अगला नोड निर्धारित किया जाएगा।
रोब

1
अगले एक के लिए एक सूत्र हो सकता है, हमें खोज करने की आवश्यकता नहीं हो सकती है। मुझे यकीन नहीं है।
सूचित

जब मैं इसके बारे में सोचता हूं, तो अगले एक का बीजगणितीय रूप मौजूद नहीं हो सकता है (सभी नियतांक समस्याओं के समाधान के लिए बीजगणितीय रूप नहीं है) इसके अलावा जब सिर्फ 2 और 5 से अधिक primes होते हैं, तो सूत्र यह खोजने में काफी मुश्किल हो सकता है कि क्या एक वास्तव में इस सूत्र को काम करना चाहता है। अगर किसी को सूत्र पता है, तो मैं शायद इसके बारे में थोड़ा पढ़ूंगा, यह दिलचस्प लगता है।
सूचित किया गया

2

ब्रायन बिल्कुल सही था - मेरा अन्य उत्तर रास्ता बहुत जटिल था। यहाँ यह करने के लिए एक सरल और तेज तरीका है।

यूक्लिडियन विमान के चतुर्थांश I की कल्पना करें, पूर्णांक तक सीमित। एक अक्ष को i- अक्ष और दूसरे अक्ष को j- अक्ष कहते हैं।

जाहिर है, मूल से दूर बिंदुओं को मूल से दूर बिंदुओं से पहले उठाया जाएगा। यह भी ध्यान दें कि सक्रिय क्षेत्र j- अक्ष से दूर जाने से पहले i- अक्ष से दूर चला जाएगा।

एक बार एक बिंदु का उपयोग किया गया है, यह कभी भी फिर से उपयोग नहीं किया जाएगा। और एक बिंदु का उपयोग केवल तभी किया जा सकता है जब बिंदु उसके ठीक नीचे या उसके बाईं ओर पहले ही उपयोग किया गया हो।

इन्हें एक साथ रखने पर, आप एक "सीमांत" या "अग्रणी धार" की कल्पना कर सकते हैं जो मूल के आसपास शुरू होती है और वे जे-अक्ष की तुलना में आई-अक्ष दूर तक फैलते हुए और दाईं ओर फैलती हैं।

वास्तव में, हम कुछ और पता लगा सकते हैं: किसी भी दिए गए आई-वैल्यू के लिए फ्रंटियर / एज पर सबसे अधिक एक बिंदु होगा। (आपको j की वृद्धि के बराबर 2 गुना से अधिक वेतन वृद्धि करनी होगी।) इसलिए, हम सीमा का प्रतिनिधित्व कर सकते हैं, जिसमें प्रत्येक i समन्वय के लिए एक तत्व युक्त सूची के रूप में, केवल j निर्देशांक और फ़ंक्शन मान के साथ भिन्न हो सकते हैं।

प्रत्येक पास, हम अग्रणी किनारे पर न्यूनतम तत्व उठाते हैं, और फिर इसे एक बार जे-दिशा में स्थानांतरित करते हैं। यदि हम अंतिम तत्व को बढ़ाते हैं, तो हम एक नए अंतिम और तत्व को बढ़ाते हैं, जिसमें एक संवर्धित i-value और 0 का j-value होता है।

using System;
using System.Collections.Generic;
using System.Text;

namespace TwosFives
{
    class LatticePoint : IComparable<LatticePoint>
    {
      public int i;
      public int j;
      public double value;
      public LatticePoint(int ii, int jj, double vvalue)
      {
          i = ii;
          j = jj;
          value = vvalue;
      }
      public int CompareTo(LatticePoint rhs)
      {
          return value.CompareTo(rhs.value);
      }
    }


    class Program
    {
        static void Main(string[] args)
        {
            LatticePoint startPoint = new LatticePoint(0, 0, 1);

            var leadingEdge = new List<LatticePoint> { startPoint } ;

            while (true)
            {
                LatticePoint min = leadingEdge.Min();
                Console.WriteLine(min.value);
                if (min.j + 1 == leadingEdge.Count)
                {
                    leadingEdge.Add(new LatticePoint(0, min.j + 1, min.value * 2));
                }
                min.i++;
                min.value *= 5;
            }
        }
    }
}

स्थान: O (n) अब तक मुद्रित तत्वों की संख्या में।

गति: O (1) आवेषण, लेकिन हर बार ऐसा नहीं किया जाता है। (कभी-कभी लंबे समय List<>तक बढ़ना होता है, लेकिन फिर भी ओ (1) परिशोधन होता है)। अब तक मुद्रित किए गए तत्वों की संख्या में न्यूनतम, O (n) की खोज में बड़ा समय सिंक है।


1
यह किस एल्गोरिथ्म का उपयोग करता है? यह काम क्यों करता है? पूछे जाने वाले प्रश्न का मुख्य भाग Does anyone have advice on how to solve such a problem?अंतर्निहित समस्या की समझ हासिल करने के प्रयास में है। एक कोड डंप उस प्रश्न का उत्तर अच्छी तरह से नहीं देता है।

अच्छी बात है, मैंने अपनी सोच को समझाया।
स्नोबोल्ड

+1 जबकि यह लगभग मेरे दूसरे स्निपेट के बराबर है, आपके अपरिवर्तनीय किनारों का उपयोग यह स्पष्ट करता है कि किनारे की गिनती कैसे बढ़ती है।
ब्रायन

यह निश्चित रूप से ब्रायन के संशोधित स्निपेट की तुलना में धीमा है, लेकिन इसका मेमोरी उपयोग व्यवहार बहुत बेहतर होना चाहिए क्योंकि यह लगातार हटाने और तत्वों को जोड़ना नहीं है। (जब तक सीएलआर या सॉर्टसेटसेट <> तत्वों के पुन: उपयोग की कुछ विधि नहीं है,
जिनके

1

सेट-आधारित समाधान शायद वही था जो आपके साक्षात्कारकर्ता की तलाश में था, हालांकि, इसमें O(n)मेमोरी और O(n lg n)कुल समय अनुक्रमण nतत्वों के लिए होने का दुर्भाग्यपूर्ण परिणाम है ।

थोड़ा सा गणित हमें एक O(1)स्थान और O(n sqrt(n))समय समाधान खोजने में मदद करता है । ध्यान दें कि 2^i * 5^j = 2^(i + j lg 5)। पहले ढूँढना nके तत्वों {i,j > 0 | 2^(i + j lg 5)}पहले पाने के लिए कम कर देता है nके तत्वों {i,j > 0 | i + j lg 5}क्योंकि समारोह (x -> 2^x)सख्ती से होगा- बढ़ती जा रही है, तो कुछ के लिए एक ही रास्ता a,bहै कि 2^a < 2^bअगर है a < b

अब, हमें केवल उस अनुक्रम को खोजने के लिए एक एल्गोरिथ्म की आवश्यकता है i + j lg 5, जहां i,jप्राकृतिक संख्याएं हैं। दूसरे शब्दों में, हमारे वर्तमान मूल्य को देखते हुए i, j, जो अगले कदम को कम करता है (यानी, अनुक्रम में हमें अगला नंबर देता है), मूल्यों में से एक में कुछ वृद्धि (कहते हैं j += 1) के साथ-साथ दूसरे में कमी ( i -= 2) है। केवल एक चीज जो हमें सीमित कर रही है वह है i,j > 0

विचार करने के लिए केवल दो मामले हैं - iबढ़ता या jबढ़ता है। हमारे अनुक्रम के बढ़ने के बाद से उनमें से एक को बढ़ना चाहिए, और दोनों नहीं बढ़ते क्योंकि अन्यथा हम उस शब्द को छोड़ रहे हैं जिसमें हमारे पास केवल एक i,jवृद्धि है। इस प्रकार एक बढ़ता है, और दूसरा वही रहता है या घटता है। C ++ 11 में व्यक्त, संपूर्ण एल्गोरिथ्म और सेट समाधान की तुलना यहां उपलब्ध है

यह निरंतर मेमोरी को प्राप्त करता है क्योंकि आउटपुट सरणी (लिंक देखें) से अलग, विधि में आवंटित वस्तुओं की केवल एक निरंतर मात्रा होती है। विधि किसी भी दिए जाने के बाद से हर बार पुनरावृत्ति को प्राप्त करती है (i,j), यह सबसे अच्छी जोड़ी के लिए ट्रैवर्स (a, b)करता है जो कि (i + a, j + b)मूल्य में सबसे छोटी वृद्धि है i + j lg 5। यह ट्रैवर्सल है O(i + j):

Attempt to increase i:
++i
current difference in value CD = 1
while (j > 0)
  --j
  mark difference in value for
     current (i,j) as CD -= lg 5
  while (CD < 0) // Have to increase the sequence
    ++i          // This while will end in three loops at most.
    CD += 1
find minimum among each marked difference ((i,j) -> CD)

Attempt to increase j:
++j
current difference in value CD = lg 5
while (j > 0)
  --i
  mark difference in value for
     current (i,j) as CD -= 1
  while (CD < 0) // have to increase the sequence
    ++j          // This while will end in one loop at most.
    CD += lg 5
find minimum among each marked difference ((i,j) -> CD)

प्रत्येक पुनरावृत्ति अद्यतन करने का प्रयास करता है i, फिर j, और दो के छोटे अद्यतन के साथ जाता है।

चूंकि iऔर jअधिकतम समय O(sqrt(n))पर, हमारे पास कुल O(n sqrt(n))समय है। iऔर jके वर्ग की दर से बढ़ने nकिसी भी अधिकतम valiues के लिए के बाद से imaxऔर jmaxवहाँ मौजूद O(i j)अद्वितीय जोड़े जो हमारे अनुक्रम बनाने के लिए करता है, तो हमारे अनुक्रम है nशर्तों, और iऔर jएक दूसरे के (कुछ निरंतर कारक के भीतर हो जाना प्रतिपादक एक रेखीय के शामिल है क्योंकि संयोजन दो के लिए), हम जानते हैं कि iऔर jहैं O(sqrt(n))

फ़्लोटिंग पॉइंट त्रुटि के बारे में चिंता करने के लिए बहुत अधिक नहीं है - चूंकि शब्द तेजी से बढ़ रहे हैं, इसलिए हमें कई परिमाणों द्वारा फ्लॉप त्रुटि पकड़ने से पहले अतिप्रवाह से निपटना होगा। अगर मेरे पास समय हो तो मैं इस पर और चर्चा जोड़ूंगा।


महान जवाब, मुझे लगता है कि किसी भी संख्या के लिए अनुक्रम बढ़ाने का एक पैटर्न भी है
InformedA

@randomA धन्यवाद। कुछ और सोचने के बाद, मैं इस निष्कर्ष पर पहुँचा कि जैसा कि यह वर्तमान में खड़ा है मेरा एल्गोरिथ्म उतना तेज़ नहीं है जितना मैंने सोचा था कि यह था। यदि "i / j बढ़ाने का प्रयास" करने का मूल्यांकन करने का एक तेज़ तरीका है, तो मुझे लगता है कि लॉगरिदमिक समय प्राप्त करने की कुंजी है।
VF1

मैं उसमें सोच रहा था: हम जानते हैं कि संख्या बढ़ाने के लिए, हमें किसी एक प्राइम की संख्या बढ़ानी होगी। उदाहरण के लिए, वृद्धि का एक तरीका 8 के साथ खच्चर करना है और 5 से विभाजित करना है। इसलिए हमें संख्या बढ़ाने और घटाने के सभी तरीकों का सेट मिलता है। इसमें केवल मूल तरीके शामिल होंगे जैसे mul 8 div 5 और नहीं mul 16 div 5. कमी करने के लिए बुनियादी तरीकों का एक और सेट भी है। इन दो सेटों को उनकी वृद्धि या कमी कारक द्वारा क्रमबद्ध करें। एक संख्या को देखते हुए, अगले एक को वृद्धि के सेट से सबसे छोटे कारक के साथ एक लागू वृद्धि का रास्ता ढूंढकर पाया जा सकता है ..
सूचित

.. लागू होने का मतलब है कि म्युल और डिव करने के लिए पर्याप्त प्राइम हैं। फिर हम नए नंबर के लिए एक कमी रास्ता खोजते हैं, इसलिए सबसे अधिक घटने वाले के साथ शुरू करें। घटने के नए तरीकों का उपयोग करते रहें और जब नया नंबर दिए गए मूल संख्या से छोटा हो तो हम रोक दें। चूंकि primes का सेट स्थिर है, इसका मतलब है दो सेटों के लिए निरंतर आकार। इसके लिए थोड़ा सा प्रमाण चाहिए, लेकिन यह मेरे लिए प्रत्येक नंबर पर निरंतर समय, निरंतर स्मृति जैसा दिखता है। तो n संख्याओं को छापने के लिए निरंतर स्मृति और रैखिक समय।
सूचित

@randomA आपको विभाजन कहाँ से मिला? क्या आपको पूरा जवाब देने में कोई दिक्कत है - मैं आपकी टिप्पणियों को नहीं समझता।
VF1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.