এখানে একটি উত্তর যা সিপিইউ ব্যয় করে ধ্রুবক স্মৃতি নিয়ে চলে। মূল প্রশ্নের (যেমন একটি সাক্ষাত্কারের সময় উত্তর) প্রসঙ্গে এটি কোনও ভাল উত্তর নয়। তবে যদি সাক্ষাত্কারটি 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 (লগ এন) মেমরি।