পরের ক্ষুদ্রতমটি 2 ^ i * 5 ^ j থেকে i, j> = 0 থেকে মুদ্রণ করুন


10

সম্প্রতি একটি প্রযুক্তিগত ফোন স্ক্রিনিংয়ের সময় আমাকে এই প্রশ্ন জিজ্ঞাসা করা হয়েছিল এবং ভাল করেনি। প্রশ্নটি নীচে ভারব্যাটিম অন্তর্ভুক্ত করা হয়েছে।

{2^i * 5^j | i,j >= 0}বাছাই করা সংগ্রহ উত্পন্ন করুন । পরের ক্ষুদ্রতম মানটি অবিচ্ছিন্নভাবে মুদ্রণ করুন।

উদাহরণ: { 1, 2, 4, 5, 8, 10...}

"পরবর্তী ছোট" আমাকে ভাবায় যে একটি মিনিট-হিপ জড়িত, তবে আমি সেখান থেকে কোথায় যাব তা সত্যই জানতাম না এবং সাক্ষাত্কারকারীর দ্বারা কোনও সহায়তা দেওয়া হয়নি।

এমন সমস্যা কীভাবে সমাধান করা যায় সে সম্পর্কে কারও পরামর্শ আছে?


আমি মনে করি সাক্ষাত্কারটি আপনাকে ধ্রুব স্মৃতিতে এটি করতে বলতে চায়। ও (এন) মেমরি ব্যবহার করা এটি একেবারে তুচ্ছ করে তোলে। অথবা কমপক্ষে ও (লগন) মেমরিটি ব্যবহার করা কারণ ইনপুট এন এর জন্য এনকোডিং আকার লগইন হবে। মেমরি সলিউশনের জন্য একটি ও (এন) হ'ল এক্সফোনেনশিয়াল মেমরি সলিউশন।
অবহিত

উত্তর:


14

আসুন সমস্যাটির শব্দটি লিখুন: প্রতিটি সংখ্যাকে 1 থেকে অনন্তে আউটপুট করুন যাতে সংখ্যাটি 2 এবং 5 বাদে কোনও কারণ থাকে না।

নীচে একটি সাধারণ সি # স্নিপেট রয়েছে:

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);
}

কিলিয়ান / প্রশ্নকারীর দৃষ্টিভঙ্গি অনেক বেশি পারফর্মেন্ট। এই পদ্ধতির সাথে সি # স্নিপেট:

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)(কারণ আমি এবং জে উভয় এন এর চেয়ে কম), এবং O(n log 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
@ সোনবডি: অপের প্রশ্নটি একটি অ্যালগরিদম প্রশ্ন, সুতরাং এটি কিছুটা অপ্রাসঙ্গিক। এটি উপেক্ষা করে আপনার প্রথম উদ্বেগটি খুব বড় পূর্ণসংখ্যার সাথে কাজ করা উচিত, কারণ আবর্জনা সংগ্রহকারী ওভারহেডের চেয়ে এটি খুব শীঘ্রই সমস্যা হয়ে দাঁড়ায়।
ব্রায়ান

8

এটি একটি সাধারণ যথেষ্ট ইন্টারভিউ প্রশ্ন যা উত্তরটি জানার জন্য এটি দরকারী। এখানে আমার ব্যক্তিগত গ্রিড শিটের প্রাসঙ্গিক এন্ট্রি রয়েছে:

  • ক্রমে 3 a 5 b 7 c ফর্মের সংখ্যা তৈরি করতে , 1 দিয়ে শুরু করুন, তিনটি সম্ভাব্য উত্তরসূরি (3, 5, 7) কে একটি সহায়ক কাঠামোতে স্টাফ করুন , তারপরে এটি থেকে আপনার তালিকাতে সবচেয়ে ছোট সংখ্যা যুক্ত করুন।

অন্য কথায়, এটিকে দক্ষতার সাথে সমাধান করার জন্য আপনার অতিরিক্ত বাছাই করা বাফার সহ একটি দ্বি-পদক্ষেপের পদ্ধতির প্রয়োজন। ( গেইল ম্যাকডোভেলের কোডিং সাক্ষাত্কারটি ক্র্যাক করাতে একটি দীর্ঘ দীর্ঘ বর্ণনা রয়েছে ।


3

এখানে একটি উত্তর যা সিপিইউ ব্যয় করে ধ্রুবক স্মৃতি নিয়ে চলে। মূল প্রশ্নের (যেমন একটি সাক্ষাত্কারের সময় উত্তর) প্রসঙ্গে এটি কোনও ভাল উত্তর নয়। তবে যদি সাক্ষাত্কারটি 24 ঘন্টা দীর্ঘ হয় তবে এটি এত খারাপ নয়। ;)

ধারণাটি হ'ল যদি আমার কাছে এন থাকে যা একটি বৈধ উত্তর, তবে পরের ধারাবাহিকটি 2 টির एन গুন 2 হতে চলেছে, কিছু পাওয়ার দ্বারা বিভক্ত Or দুটি শক্তি প্রদত্ত এটি সমানভাবে বিভক্ত হয়। (... বা বিভাজক 1% হতে পারে) সেক্ষেত্রে আপনি কেবল 2 বা 5 দিয়ে গুণ করছেন)

উদাহরণস্বরূপ, 625 থেকে 640 পর্যন্ত যেতে, 5 ** 4/2 ** দিয়ে গুণ করুন Or. বা আরও সাধারণভাবে 2 ** m * 5 ** nকিছু মি, এন এর কোনও মান দিয়ে গুণ করুন যেখানে একটি ধনাত্মক এবং একটি নেতিবাচক বা শূন্য, এবং গুণক সংখ্যাটি সমানভাবে ভাগ করে।

এখন, জটিল অংশটি গুণকটি সন্ধান করবে। তবে আমরা জানি যে) বিভাজকের অবশ্যই সংখ্যাটি সমানভাবে ভাগ করতে হবে, খ) গুণকটি অবশ্যই একের বেশি হবে (সংখ্যাগুলি বাড়তে থাকবে), এবং গ) যদি আমরা 1 এর চেয়ে কম গুণককে বেছে নিই (যেমন 1 <চ <সমস্ত অন্যান্য চ এর) ), তারপরে এটি আমাদের পরবর্তী পদক্ষেপের গ্যারান্টিযুক্ত। তারপরে পদক্ষেপটি এটি সর্বনিম্ন পদক্ষেপ হবে।

বাজে অংশটি এম, এন এর মান সন্ধান করছে। লগ (এন) এর কেবলমাত্র সম্ভাবনা রয়েছে, কারণ হাল ছাড়ার জন্য কেবলমাত্র 2 বা 5 এর বেশি রয়েছে, তবে রাউন্ডঅফের সাথে মোকাবিলা করার জন্য আমাকে একটি -1 -1 থেকে +1 এর একটি ফ্যাক্টর যুক্ত করতে হয়েছিল। সুতরাং আমাদের কেবল প্রতিটি পদক্ষেপে ও (লগ (এন)) এর মাধ্যমে পুনরাবৃত্তি করতে হবে। সুতরাং এটি সামগ্রিকভাবে ও (এন লগ (এন))।

সুসংবাদটি হ'ল, যেহেতু এটি একটি মান নেয় এবং পরবর্তী মান খুঁজে পায়, আপনি ক্রমের যে কোনও জায়গায় শুরু করতে পারেন। সুতরাং আপনি যদি 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 সংখ্যাগুলিকে আমি বৈধতা দিয়েছি এবং এটি কমপক্ষে এখনও কাজ করে।

বিটিডব্লিউ পরের এক ট্রিলিয়ন পরে মনে হয় 1,024,000,000,000 হবে।

...

হুঁ। আমি best()ক্রমবর্ধমানভাবে প্রসারিত করে এমন লুকিং টেবিল হিসাবে চিকিত্সা করে আমি ও (এন) পারফরম্যান্স - ও (1) প্রতি মূল্য (!) - এবং ও (লগ এন) মেমরির ব্যবহার পেতে পারি। এই মুহুর্তে এটি প্রতিটি সময় পুনরাবৃত্তি করে মেমরি সঞ্চয় করে, তবে এটি প্রচুর অনর্থক গণনা করছে। এই মধ্যবর্তী মানগুলি এবং ন্যূনতম মানগুলির একটি তালিকা ধরে রেখে - আমি সদৃশ কাজটি এড়াতে এবং এটিকে অনেক গতি বাড়িয়ে তুলতে পারি। তবে মধ্যবর্তী মানগুলির তালিকা n এর সাথে বৃদ্ধি পাবে তাই O (লগ এন) মেমরি।


দুর্দান্ত উত্তর। আমার অনুরূপ ধারণা আছে যা আমি কোড করি নি। এই ধারণায়, আমি 2 এবং 5 এর জন্য একটি ট্র্যাকার রাখি এটি সর্বাধিক nএবং mএটি এখনও পর্যন্ত সিকোয়েন্সির মধ্যে সংখ্যাগুলি ব্যবহার করার জন্য ট্র্যাক করবে । প্রতিটি পুনরাবৃত্তিতে, nবা mসম্ভবত বা উপরে যেতে পারে। আমরা একটি নতুন সংখ্যা তৈরি করি 2^(max_n+1)*5^(max_m+1)ততক্ষণে এই সংখ্যাটি বিস্মৃতকর পুনরাবৃত্তিমূলকভাবে হ্রাস করে প্রতিটি কলটি 1 দ্বারা কমিয়ে দেয় যতক্ষণ না আমরা বর্তমান সংখ্যার চেয়ে ন্যূনতম যেটি পাওয়া যায় get আমরা আপডেট max_n, max_mপ্রয়োজন হিসাবে। এই ধ্রুব স্মৃতি। O(log^2(n))যদি ডিপি ক্যাশে হ্রাস কলটিতে ব্যবহৃত হয় তবে স্মরণ করা যেতে পারে
ইনফর্মডএ

মজাদার. এখানে অপ্টিমাইজেশনটি হ'ল এটি সমস্ত জোড় ম & এন বিবেচনা করার দরকার নেই, কারণ আমরা সঠিক মি জানি, এন নিকটতম গুণকটি 1 এ উত্পাদন করবে So সুতরাং আমার কেবলমাত্র মি = -i থেকে ম্যাক্স_ই মূল্যায়ন করতে হবে এবং আমি রাউন্ডঅফের জন্য কিছু আবর্জনা ফেলে কেবল n গণনা করতে পারে (আমি ম্লান ছিলাম এবং কেবল 1 -1 থেকে 1 পুনরাবৃত্তি করেছি, তবে এটি আরও চিন্তাভাবনা বহন করে;))।
রব

যাইহোক, আমি আপনার মতো চিন্তাভাবনা করছি ... ক্রমটি হ'ল নির্বিচারবাদী হতে চলেছে ... এটি সত্যিই একটি বড় পাস্কালের ত্রিভুজ আই + 1 এর একদিকে এবং অন্যদিকে জে + 1 এর মতো। সুতরাং ক্রমটি গাণিতিকভাবে নির্বিচারক হওয়া উচিত। ত্রিভুজের যে কোনও নোডের জন্য, সর্বদা একটি গাণিতিকভাবে নির্ধারিত পরবর্তী নোড হবে।
রব

1
পরেরটির জন্য একটি সূত্র থাকতে পারে, আমাদের অনুসন্ধানের প্রয়োজন হতে পারে না। আমি নিশ্চিত জানি না।
অবহিত

যখন আমি এটি সম্পর্কে চিন্তা করি, পরবর্তী একের বীজগণিত ফর্মের অস্তিত্ব থাকতে পারে (সমাধানগুলিতে সমস্ত নিরস্ত্রী সমস্যাগুলির বীজগণিত ফর্ম থাকে না) এছাড়াও যখন কেবল 2 এবং 5 এর চেয়ে বেশি প্রাইম থাকে তবে সূত্রটি খুঁজে পাওয়া বেশ শক্ত হতে পারে সত্যিই এই সূত্রটি কাজ করতে চায়। যদি কেউ সূত্রটি জানেন তবে আমি সম্ভবত এটি সম্পর্কে কিছুটা পড়তে পারি, এটি আকর্ষণীয় বলে মনে হয়।
অবহিত

2

ব্রায়ান একেবারে ঠিক ছিল - আমার অন্য উত্তরটি ছিল খুব জটিল। এটি করার একটি সহজ এবং দ্রুত উপায় এখানে।

ইক্য্লিডিয়ান বিমানের চতুর্থাংশ প্রথম কল্পনা করুন, পূর্ণসংখ্যার মধ্যে সীমাবদ্ধ। একটি অক্ষকে i-axis এবং অন্য অক্ষকে j-axis বলুন।

স্পষ্টতই, উত্সের নিকটবর্তী পয়েন্টগুলি উত্স থেকে অনেক দূরের পয়েন্টগুলির আগে বাছাই করা হবে। এছাড়াও নোট করুন যে সক্রিয় অঞ্চলটি জে অক্ষ থেকে দূরে সরে যাওয়ার আগে আই-অক্ষ থেকে দূরে সরে যাবে।

একবার পয়েন্ট ব্যবহার করা হয়ে গেলে, এটি আর কখনও ব্যবহার করা হবে না। এবং একটি পয়েন্ট কেবল তখনই ব্যবহার করা যেতে পারে যদি সরাসরি তার নীচে বা এর বাম দিকে পয়েন্টটি ব্যবহৃত হয়।

এগুলি একসাথে রেখে, আপনি এমন একটি "সীমান্ত" বা "শীর্ষস্থান" ধারণা করতে পারেন যা উত্সের চারপাশে শুরু হয় এবং সেগুলি ডানদিকে এবং ডানদিকে ছড়িয়ে যায় এবং জে অক্ষের চেয়ে আরও বেশি প্রসারিত হয় along

আসলে, আমরা আরও কিছু বের করতে পারি: প্রদত্ত আই-মানটির জন্য সীমা / প্রান্তে সর্বাধিক এক পয়েন্ট থাকবে। (আপনাকে জে এর ইনক্রিমেন্টের সমান করতে আমাকে আরও 2 বার বাড়িয়ে দিতে হবে।) সুতরাং, আমরা প্রতিটি স্থানাঙ্কের জন্য একটি উপাদান যুক্ত একটি তালিকা হিসাবে সীমান্তকে উপস্থাপন করতে পারি, কেবল জে স্থানাঙ্ক এবং ফাংশন মানের সাথে পরিবর্তিত।

প্রতিটি পাস, আমরা নেতৃস্থানীয় প্রান্তে ন্যূনতম উপাদানটি চয়ন করি এবং তারপরে এটি একবার জে-দিকে নিয়ে যাই। যদি আমরা শেষ উপাদানটি উত্থাপন করে যাচ্ছি, আমরা বর্ধিত আই-মান এবং 0 এর জে-মান সহ একটি নতুন শেষ আরও উপাদান যুক্ত করব।

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) এ পর্যন্ত মুদ্রিত উপাদানগুলির সংখ্যা।

গতি: ও (1) সন্নিবেশ করানো হয় তবে প্রতিবার তা করা হয় না। (মাঝে মাঝে লম্বা হওয়া যখন List<>বাড়তে হয় তবে তবুও ও (1) অনুশীলন করা হয়)। বড় সময় সিংক হ'ল এখন পর্যন্ত মুদ্রিত উপাদানের সংখ্যায় ন্যূনতম, ও (এন) অনুসন্ধান করা।


1
এটি কোন অ্যালগরিদম ব্যবহার করে? কেন এটি কাজ করে? যে প্রশ্নটি করা হচ্ছে তার মূল অংশটি Does anyone have advice on how to solve such a problem?অন্তর্নিহিত সমস্যার বোঝার চেষ্টা an একটি কোড ডাম্প সেই প্রশ্নের উত্তর ভালভাবে দেয় না।

ভালো কথা, আমি আমার চিন্তাভাবনাটি ব্যাখ্যা করেছিলাম।
স্নোবডি

+1 যদিও এটি আমার দ্বিতীয় স্নিপেটের মোটামুটি সমতুল্য, আপনার অপরিবর্তনীয় প্রান্তগুলির ব্যবহার এটিকে আরও পরিষ্কার করে দেয় যে প্রান্তের গণনা কীভাবে বৃদ্ধি পায়।
ব্রায়ান

এটি অবশ্যই ব্রায়ানের সংশোধিত স্নিপেটের চেয়ে ধীরে ধীরে, তবে এটির মেমরি ব্যবহারের আচরণটি আরও ভাল হওয়া উচিত কারণ এটি নিয়মিতভাবে মোছা এবং সংযোজন না করে isn't (সিএলআর বা सॉোর্টসেট <> যদি না এমন উপাদানগুলির পুনরায় ব্যবহার করার কিছু পদ্ধতি না থাকে তবে)
স্নোবডি

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রয়েছে তার ক্রম খুঁজতে কেবল একটি অ্যালগরিদম প্রয়োজন need অন্য কথায়, আমাদের বর্তমান মান দেওয়া i, j, কি পরবর্তী পদক্ষেপ ছোট (অর্থাত, আমাদের ক্রমানুসারে পরবর্তী সংখ্যা দেয়), মান (বলুন এক কিছু বৃদ্ধি j += 1অন্যান্য হ্রাস (সহ) i -= 2)। আমাদের সীমাবদ্ধ একটাই জিনিস i,j > 0

বিবেচনা করার জন্য কেবল দুটি মামলা রয়েছে - iবৃদ্ধি বা jবৃদ্ধি। তাদের ক্রমবিকাশ অবশ্যই বাড়বে যেহেতু আমাদের ক্রম ক্রমবর্ধমান হয় এবং উভয়ই বৃদ্ধি পায় না অন্যথায় আমরা সেই পদটি এড়িয়ে যাচ্ছি যেখানে আমাদের কেবল একটি i,jবৃদ্ধি রয়েছে। এইভাবে একটি বৃদ্ধি পায়, এবং অন্যটি একই থাকে বা হ্রাস পায়। সি ++ 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কোনও সর্বোচ্চ মানগুলির জন্য স্কোয়ারের হারে বৃদ্ধি পাও imaxএবং jmaxসেখানে O(i j)আমাদের সিকোয়েন্সটি nশর্তাবলী হলে আমাদের ক্রমটি তৈরি করার জন্য অনন্য জোড়া রয়েছে iএবং jএটি একে অপরের কিছুটা ধ্রুবক ফ্যাক্টরের মধ্যে বৃদ্ধি পায় (কারণ সূচকটি একটি রৈখিক সমন্বিত থাকে) উভয় জন্য সংমিশ্রণ), আমরা জানি যে iএবং jহয় O(sqrt(n))

ভাসমান বিন্দু ত্রুটি সম্পর্কে খুব বেশি চিন্তা করার দরকার নেই - যেহেতু শর্তগুলি তাত্পর্যপূর্ণভাবে বৃদ্ধি পায়, বেশ কয়েকটি মাত্রার দ্বারা ফ্লপ ত্রুটিটি আমাদের কাছে ধরা পড়ার আগে আমাদের ওভারফ্লো নিয়ে কাজ করতে হবে। আমার কাছে সময় থাকলে আমি এটিতে আরও আলোচনা যুক্ত করব।


দুর্দান্ত উত্তর, আমি মনে করি যে কোনও সংখ্যক প্রাইমগুলির ক্রম বাড়ানোর একটি প্যাটার্নও রয়েছে
ইনফর্মডএ

ধন্যবাদ আরও কিছু চিন্তাভাবনা করার পরে, আমি এই সিদ্ধান্তে পৌঁছেছি যে এটি বর্তমানে আমার অ্যালগরিদম হিসাবে দাঁড়িয়েছে বলে মনে হয়েছিল তত দ্রুত নয়। যদি "আই / জে বাড়ানোর চেষ্টা" মূল্যায়নের আরও দ্রুত উপায় থাকে তবে আমি মনে করি এটি লোগারিথমিক সময় পাওয়ার মূল চাবিকাঠি।
ভিএফ 1

আমি এটি নিয়েই ভাবছিলাম: আমরা জানি যে সংখ্যাটি বাড়ানোর জন্য আমাদের প্রাইমগুলির একটির সংখ্যা বাড়াতে হবে। উদাহরণস্বরূপ, বৃদ্ধির এক উপায় হ'ল 8 দিয়ে মুল এবং 5 দিয়ে বিভাজন করা So সুতরাং আমরা সংখ্যাটি বৃদ্ধি এবং হ্রাস করার সমস্ত উপায়ের সেট পাই। এটিতে মুল 8 ডিভি 5 এবং মূল 16 ডিবি 5 এর মতো কেবল মৌলিক উপায়ে থাকবে decrease হ্রাস করার জন্য মৌলিক উপায়গুলির আরও একটি সেটও রয়েছে। এই দুটি সেট তাদের বৃদ্ধি বা হ্রাস ফ্যাক্টর অনুসারে বাছাই করুন। একটি সংখ্যা দেওয়া, পরের এক বৃদ্ধি সেট থেকে ক্ষুদ্রতম ফ্যাক্টর সঙ্গে একটি প্রযোজ্য বৃদ্ধি উপায় খুঁজে বের পাওয়া যাবে ..
InformedA

.. প্রযোজ্য মানে মুল এবং ডিভ সম্পাদন করার জন্য যথেষ্ট প্রাইম রয়েছে। তারপরে আমরা নতুন সংখ্যার হ্রাসের উপায় খুঁজে পাই, তাই সবচেয়ে বেশি হ্রাস পাওয়া একটি দিয়ে শুরু করে। হ্রাস করার জন্য নতুন উপায়গুলি ব্যবহার করা চালিয়ে যান এবং যখন নতুন সংখ্যাটি মূল প্রদত্ত সংখ্যার চেয়ে ছোট হয় আমরা থামি। যেহেতু প্রাইমসের সেটটি ধ্রুবক তাই এর অর্থ দুটি সেটগুলির জন্য ধ্রুব আকার। এটির পাশাপাশি অল্প অল্প প্রমাণ দরকার তবে এটি প্রতিটি সংখ্যায় ধ্রুবক সময়, ধ্রুবক স্মৃতি হিসাবে দেখায়। N সংখ্যা মুদ্রণের জন্য ধ্রুবক মেমরি এবং রৈখিক সময়।
অবহিত

@ আরন্ডোম আপনি কোথা থেকে বিভাগ পেয়েছেন? আপনার কি পুরো উত্তর দেওয়ার বিষয়ে আপত্তি আছে - আমি আপনার মন্তব্যগুলি বেশ বুঝতে পারি না।
ভিএফ 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.