පහසු සම්මුඛ පරීක්ෂණ ප්‍රශ්නය වඩාත් අපහසු විය: ලබා දී ඇති අංක 1..100, හරියටම k ලබා දී ඇති අංක (ය) නැති බව සොයා ගන්න


1157

ටික කලකට පෙර මට රසවත් රැකියා සම්මුඛ පරීක්ෂණ අත්දැකීමක් ලැබුණි. ප්‍රශ්නය ආරම්භ වූයේ ඉතා පහසු ය:

Q1 : අපි සංඛ්යා අඩංගු මල්ලක් තියෙනවා 1, 2, 3, ..., 100. සෑම අංකයක්ම හරියටම එක් වරක් දිස්වන බැවින් අංක 100 ක් ඇත. දැන් එක් අංකයක් අහඹු ලෙස බෑගයෙන් ඉවතට ගනු ලැබේ. නැතිවූ අංකය සොයා ගන්න.

මෙම සම්මුඛ පරීක්ෂණ ප්‍රශ්නය මා මීට පෙර අසා ඇත්තෙමි, එබැවින් මම ඉතා ඉක්මණින් පිළිතුරු දුන්නේ:

A1 : හොඳයි, සංඛ්යා වල මුදලක් 1 + 2 + 3 + … + Nවේ (N+1)(N/2)(බලන්න : සමාන්තර ශ්රේණියක ඓක්යය විකිපීඩියා, නිදහස් විශ්වකෝෂය ). මක්නිසාද යත් N = 100, එකතුවයි 5050.

මේ අනුව, සියලුම අංක බෑගයේ තිබේ නම්, මුදල හරියටම වනු ඇත 5050. එක් අංකයක් අස්ථානගත වී ඇති බැවින්, එකතුව මෙයට වඩා අඩු වනු ඇති අතර වෙනස එම අංකය වේ. ඒ නිසා අපට එම අස්ථානගත වූ අංකය O(N)කාලය හා O(1)අවකාශය තුළ සොයාගත හැකිය .

මේ අවස්ථාවේදී මම හිතුවා මම හොඳට කළා කියලා, නමුත් හදිසියේම ප්‍රශ්නය අනපේක්ෂිත හැරීමක් ගත්තා:

Q2 : එය නිවැරදියි, නමුත් දැන් TWO අංක නොමැති නම් ඔබ මෙය කරන්නේ කෙසේද?

මම මීට පෙර කවදාවත් මෙම විචලනය දැක නැත / අසා නැත / සලකා බැලුවෙමි, එබැවින් මම භීතියට පත්වූ අතර ප්‍රශ්නයට පිළිතුරු දීමට නොහැකි විය. සම්මුඛ පරීක්‍ෂකවරයා මගේ චින්තන ක්‍රියාවලිය දැන ගැනීමට අවධාරනය කළේය, එබැවින් මම සඳහන් කළේ අපේක්ෂිත නිෂ්පාදනය හා සැසඳීමෙන් අපට තවත් තොරතුරු ලබා ගත හැකි බව හෝ පළමු මුරපදයෙන් යම් යම් තොරතුරු එක්රැස් කිරීමෙන් පසු දෙවන වරට සමත් වීම යනාදිය ගැන ය. සැබවින්ම විසඳුම සඳහා පැහැදිලි මාවතක් තිබීමට වඩා අඳුරේ.

සම්මුඛ පරීක්‍ෂකවරයා මා දිරිමත් කිරීමට උත්සාහ කළේ දෙවන සමීකරණයක් තිබීම ඇත්ත වශයෙන්ම ගැටලුව විසඳීමට එක් ක්‍රමයක් බවයි. මේ අවස්ථාවේ දී මම යම් ආකාරයක කලබලයට පත් වූවෙමි (පිළිතුරට පෙර පිළිතුර නොදැන සිටීම නිසා), මෙය සාමාන්‍ය (කියවන්න: "ප්‍රයෝජනවත්") ක්‍රමලේඛන තාක්‍ෂණයක්ද, නැතහොත් එය උපක්‍රමයක් / ගොචා පිළිතුරක් දැයි විමසීය.

සම්මුඛ පරීක්ෂකගේ පිළිතුර මා මවිතයට පත් කළේය: නැතිවූ අංක 3 ක් සොයා ගැනීමේ තාක්ෂණය ඔබට සාමාන්‍යකරණය කළ හැකිය. ඇත්ත වශයෙන්ම, k නැතිවූ සංඛ්‍යා සොයා ගැනීමට ඔබට එය සාමාන්‍යකරණය කළ හැකිය .

Qk : බෑගයේ හරියටම k අංක නොමැති නම්, ඔබ එය කාර්යක්ෂමව සොයා ගන්නේ කෙසේද?

මෙය මීට මාස කිහිපයකට පෙර සිදු වූ අතර, මෙම තාක්ෂණය කුමක්දැයි මට තවමත් සිතාගත නොහැකි විය. නිසැකවම Ω(N)අපි සියලු සංඛ්‍යා අවම වශයෙන් එක් වරක් පරිලෝකනය කළ යුතු බැවින් කාල සීමාව අඩුය, නමුත් සම්මුඛ පරීක්‍ෂකවරයා තරයේ කියා සිටියේ විසඳීමේ තාක්‍ෂණයේ TIME සහ SPACE සංකීර්ණතාව ( O(N)කාල ආදාන පරිලෝකනය us ණ කිරීම) k නොව N වලින් අර්ථ දක්වා ඇති බවයි .

එබැවින් මෙහි ඇති ප්‍රශ්නය සරල ය:

  • ඔබ Q2 විසඳන්නේ කෙසේද?
  • ඔබ Q3 විසඳන්නේ කෙසේද?
  • ඔබ Qk විසඳන්නේ කෙසේද?

පැහැදිලි කිරීම්

  • සාමාන්‍යයෙන් 1 සිට N සංඛ්‍යා ඇත .. එන් , 1..100 පමණක් නොවේ.
  • මම පැහැදිලි සෙට්-පදනම් විසඳුමක් සොයන්නේ නැත, උදා: බිට් සෙට් එකක් භාවිතා කිරීම , එක් එක් අංකයන් නියම කරන ලද බිට් එකක වටිනාකම අනුව පැමිණීම / නොපැමිණීම කේතනය කිරීම, එබැවින් O(N)අමතර අවකාශයේ බිටු භාවිතා කිරීම . N ට සමානුපාතිකව අපට අමතර ඉඩක් ලබා ගත නොහැක .
  • මම පැහැදිලිවම වර්ග කිරීමේ පළමු ප්‍රවේශය සොයන්නේ නැත. මෙය සහ සැකසුම් පදනම් කරගත් ප්‍රවේශය සම්මුඛ සාකච්ඡාවකදී සඳහන් කිරීම වටී (ඒවා ක්‍රියාත්මක කිරීමට පහසු වන අතර N මත පදනම්ව ඉතා ප්‍රායෝගික විය හැකිය). මම සොයන්නේ ශුද්ධ ග්‍රේල් විසඳුමයි (එය ක්‍රියාත්මක කිරීමට ප්‍රායෝගික විය හැකි හෝ නොවිය හැකි නමුත් අපේක්ෂිත අසමමිතික ලක්ෂණ ඇතත්).

එබැවින් නැවතත්, ඇත්ත වශයෙන්ම ඔබ ආදානය පරිලෝකනය කළ යුතුය O(N), නමුත් ඔබට ලබා ගත හැක්කේ ඉතා සුළු තොරතුරු ප්‍රමාණයක් පමණි ( k නොව N ලෙස අර්ථ දක්වා ඇත ), පසුව k නැතිවූ සංඛ්‍යා කෙසේ හෝ සොයා ගත යුතුය .


7
@polygenelubricants පැහැදිලි කිරීම් වලට ස්තූතියි. "මම සොයන්නේ ඕ (එන්) කාලය සහ ඕ (කේ) අවකාශය භාවිතා කරන ඇල්ගොරිතමයක් වන අතර K යනු නොපැමිණෙන සංඛ්‍යා ගණනය කිරීමකි" මුල සිටම පැහැදිලි වනු ඇත ;-)
ඩේව් ඕ.

7
Q1 ප්‍රකාශයේ දී ඔබට සංඛ්‍යා අනුපිළිවෙලට ප්‍රවේශ විය නොහැකි බව ඔබ නිවැරදිව කිව යුතුය. මෙය ඔබට පැහැදිලිව පෙනෙන බව පෙනේ, නමුත් මම කිසි විටෙකත් ප්‍රශ්නය ගැන අසා නැති අතර “බෑග්” (එහි තේරුම “මල්ටිසෙට්” යන්නද) ව්‍යාකූල විය.
ජෙරමි

8
මෙහි දක්වා ඇති පිළිතුරු හාස්‍යජනක බැවින් කරුණාකර පහත සඳහන් දේ කියවන්න: stackoverflow.com/questions/4406110/…

18
අසීමිත පූර්ණ සංඛ්‍යාවක් සඳහා අවකාශ අවශ්‍යතාවය O (1) ලෙස ඔබ නොසලකන්නේ නම්, සංඛ්‍යා සාරාංශ කිරීමේ විසඳුමට ලොග් (N) අවකාශය අවශ්‍ය වේ. නමුත් ඔබ අසීමිත නිඛිල සංඛ්‍යාවක් සඳහා ඉඩ දෙන්නේ නම්, ඔබට අවශ්‍ය වන්නේ එක් පූර්ණ සංඛ්‍යාවක් සමඟ පමණි.
උදෝ ක්ලයින්

3
Q1 සඳහා ඉතා හොඳ විකල්ප විසඳුමක් XORවනුයේ සිට සියලු සංඛ්‍යා ගණනය කිරීම විය හැකි 1අතර n, පසුව ලබා දී ඇති අරාවෙහි ඇති සියලුම සංඛ්‍යා සමඟ xoring ප්‍රති result ලය විය හැකිය . අවසානයේ ඔබට නැතිවූ අංකය තිබේ. මෙම විසඳුමේදී සාරාංශගත කිරීමේදී මෙන් පිටාර ගැලීම ගැන ඔබ සැලකිලිමත් විය යුතු නැත.
sbeliakov

Answers:


594

මෙන්න ඩිමිට්‍රිස් ඇන්ඩෘගේ සබැඳියේ සාරාංශයක් .

I = 1,2, .., k ඇති i-th බලයන්ගේ එකතුව මතක තබා ගන්න. මෙය සමීකරණ පද්ධතිය විසඳීමේ ගැටළුව අඩු කරයි

a 1 + a 2 + ... + a k = b 1

a 1 2 + a 2 2 + ... + a k 2 = b 2

...

a 1 k + a 2 k + ... + a k k = b k

නිව්ටන්ගේ අනන්‍යතා භාවිතා කරමින් , b i දැන ගැනීම ගණනය කිරීමට ඉඩ දෙයි

c 1 = a 1 + a 2 + ... a k

c 2 = a 1 a 2 + a 1 a 3 + ... + a k-1 a k

...

c k = a 1 a 2 ... a k

ඔබ බහුපද (xa 1 ) පුළුල් කළහොත් ... (xa k ) සංගුණක හරියටම c 1 , ..., c k වනු ඇත - Viète හි සූත්‍ර බලන්න . සෑම බහුපද සාධක අද්විතීය ලෙස (බහුපද වල මුද්ද යුක්ලීඩියානු වසමකි ), මෙයින් අදහස් කරන්නේ i ප්‍රේරණය දක්වා අද්විතීය ලෙස තීරණය වන බවයි.

සංඛ්‍යා නැවත ලබා ගැනීමට බලතල මතක තබා ගැනීම ප්‍රමාණවත් බවට මෙය සාක්ෂියක් අවසන් කරයි. නියත k සඳහා මෙය හොඳ ප්‍රවේශයකි.

කෙසේ වෙතත්, k වෙනස් වන විට, c 1 , ..., c k ගණනය කිරීමේ approach ජු ප්‍රවේශය තහනම්ය, මන්ද උදා: c k යනු නැතිවූ සියලු සංඛ්‍යා වල නිෂ්පාදිතය වන බැවින් විශාලත්වය n! / (Nk)!. මෙය මඟහරවා ගැනීම සඳහා, z q ක්ෂේත්‍රයේ ගණනය කිරීම් සිදු කරන්න , එහිදී q යනු ප්‍රයිම් එකක් වන අතර එය n <= q <2n - එය පවතින්නේ බර්ට්‍රන්ඩ්ගේ උපකල්පනයෙනි . සූත්‍ර තවමත් පවතින හෙයින්, බහුපදවල සාධකකරණය තවමත් අද්විතීය බැවින් සාධනය වෙනස් කිරීම අවශ්‍ය නොවේ. සීමිත ක්ෂේත්‍රයන්හි සාධකකරණය සඳහා ඔබට ඇල්ගොරිතමයක් ද අවශ්‍ය වේ, උදාහරණයක් ලෙස බර්ලෙකැම්ප් හෝ කැන්ටර්-සැසෙන්හවුස් .

නියත k සඳහා ඉහළ මට්ටමේ ව්‍යාජ කේතය:

  • දී ඇති සංඛ්‍යා වල i-th බලයන් ගණනය කරන්න
  • නොදන්නා සංඛ්‍යා වල i-th බලයන් ලබා ගැනීම සඳහා අඩු කරන්න. මුදල් අමතන්න b i .
  • B i සිට සංගුණක ගණනය කිරීම සඳහා නිව්ටන්ගේ අනන්‍යතා භාවිතා කරන්න ; ඔවුන් අමතන්න c i . මූලික වශයෙන්, c 1 = b 1 ; c 2 = (c 1 b 1 - b 2 ) / 2; නිශ්චිත සූත්‍ර සඳහා විකිපීඩියාව බලන්න
  • බහුපද x k -c 1 x k-1 + ... + c k සාධකය .
  • බහුපදයේ මූලයන් අවශ්‍ය අංක 1 , ..., k .

K වෙනස් කිරීම සඳහා, උදා: මිලර්-රාබින් භාවිතා කරමින් ප්‍රයිම් n <= q <2n සොයාගෙන, සියලු සංඛ්‍යා අඩු කළ මොඩියුලෝ q සමඟ පියවර කරන්න.

සංස්කරණය කරන්න: මෙම පිළිතුරේ පෙර සංස්කරණයේ සඳහන් වූයේ q ප්‍රමුඛ වන Z q වෙනුවට 2 (q = 2 ^ (log n)) ලක්ෂණයෙන් සීමිත ක්ෂේත්‍රයක් භාවිතා කළ හැකි බවයි. නිව්ටන්ගේ සූත්‍ර වලට k දක්වා සංඛ්‍යා අනුව බෙදීම අවශ්‍ය බැවින් මෙය එසේ නොවේ.


6
ඔබට ප්‍රාථමික ක්ෂේත්‍රයක් භාවිතා කිරීමට අවශ්‍ය නැත, ඔබටද භාවිතා කළ හැකිය q = 2^(log n). (ඔබ සුපිරි හා දායකත්වයන් සෑදුවේ කෙසේද?!)
හෙන්රිච් ඇෆෙල්මස්

50
+1 මෙය ඇත්තෙන්ම දක්ෂයි. ඒ අතරම, එය සැබවින්ම උත්සාහ කිරීම වටී ද, නැතහොත් (සමහර කොටස්) තරමක් කෘතිම ගැටලුවකට මෙම විසඳුම වෙනත් ආකාරයකින් නැවත භාවිතා කළ හැකිද යන්න සැක සහිත ය. මෙය සැබෑ ලෝක ගැටලුවක් වුවද, බොහෝ වේදිකාවල වඩාත්ම සුළු O(N^2)විසඳුම මෙම සුන්දරත්වය සාධාරණ ලෙස ඉහළ මට්ටමකට ගෙන ඒමට ඉඩ ඇත N. මට මේ ගැන සිතීමට සලස්වයි : tinyurl.com/c8fwgw එසේ වුවද, විශිෂ්ට වැඩක්! සියලු ගණිතය හරහා බඩගා යාමට මට ඉවසීමක්
නොතිබෙනු ඇත

170
මම හිතන්නේ මේක පුදුමාකාර පිළිතුරක්. සම්මුඛ පරීක්ෂණ ප්‍රශ්නයක අතුරුදහන් වූ සංඛ්‍යා එකකට වඩා දිගු කිරීම කෙතරම් දුප්පත්ද යන්න මෙයින් පැහැදිලි වන බව මම සිතමි. පළමුවැන්න පවා ගොචියා වර්ගයකි, නමුත් එය මූලික වශයෙන් පෙන්නුම් කරන්නේ "ඔබ සම්මුඛ පරීක්ෂණ කිහිපයක් සූදානම් කර ඇති" බවයි. CS ප්‍රධානියෙකු k = 1 ඉක්මවා යන බව දැන ගැනීම අපේක්ෂා කිරීම (විශේෂයෙන් සම්මුඛ සාකච්ඡාවකදී “ස්ථානයේදීම”) ටිකක් මෝඩ වැඩකි.
corsiKa

5
මෙය ආදානය මත රීඩ් සොලමන් කේතීකරණය effectively ලදායී ලෙස සිදු කරයි.
ඩේවිඩ් එර්මන්

80
සෑම අංකයක්ම ඇතුලත් කර සංඛ්‍යා අතුරුදහන් වී ඇත්දැයි සොයා බැලීම hash setසඳහා 1...Nසූට් එක හරහා නැවත ගමන් කිරීම, වඩාත්ම පොදු, kවිචල්‍යතාවයන් සම්බන්ධයෙන් සාමාන්‍යයෙන් වේගවත්ම , වඩාත්ම නිදොස් කළ හැකි වඩාත්ම නඩත්තු කළ හැකි සහ තේරුම්ගත හැකි විසඳුමක් වනු ඇතැයි මම සිතමි . ඇත්ත වශයෙන්ම ගණිත ක්‍රමය සිත් ඇදගන්නා සුළු නමුත් කොතැනක හෝ ඔබ ගණිත ian යෙකු නොව ඉංජිනේරුවෙකු විය යුතුය. විශේෂයෙන් ව්‍යාපාරයට සම්බන්ධ වූ විට.
v.oddou

245

මුතුක්‍රිෂ්ණන්ගේ පිටු කිහිපයක් කියවීමෙන් ඔබට එය සොයාගත හැකිය - දත්ත ප්‍රවාහ ඇල්ගොරිතම: ප්‍රහේලිකාව 1: නැතිවූ අංක සොයා ගැනීම . එය ඔබ සොයන සාමාන්‍යකරණය හරියටම පෙන්වයි . ඔබේ සම්මුඛ පරීක්ෂක කියවූ දේ සහ ඔහු මෙම ප්‍රශ්න මතු කළේ ඇයිද යන්න බොහෝ විට මෙයයි.

දැන්, මුතුක්‍රිෂ්ණන්ගේ ප්‍රතිකාරයට යටත් වූ හෝ අභිබවා යන පිළිතුරු මකා දැමීමට මිනිසුන් පටන් ගන්නේ නම් සහ මෙම පා find ය පහසුවෙන් සොයාගත හැකිය. :)


ව්‍යාජ කේත ඇතුළත් sdcvvc හි සෘජුවම සම්බන්ධ පිළිතුරද බලන්න ( ඉක්මන් කරන්න!


අපොයි ... ඒක රසවත්. ගණිතය නිසා මම ටිකක් ව්‍යාකූල වූ බව පිළිගත යුතුය. නමුත් මම එය මග හැරියෙමි. පසුව බැලීමට බැලීමට එය විවෘතව තැබිය හැකිය. :) සහ +1 මෙම සබැඳිය වඩාත් සොයාගත හැකි වීමට. ;-)
ක්‍රිස්

2
ගූගල් පොත් සබැඳිය මට වැඩ කරන්නේ නැත. මෙන්න වඩා හොඳ අනුවාදයක් [PostScript ගොනුව].
හෙන්රිච් ඇෆෙල්මස්

9
වොව්. මම හිතුවේ නැහැ මේක ඉහළට එයි කියලා! අවසන් වරට මම විසඳුම ගැන සඳහනක් පළ කළෙමි (නුත්, ඒ අවස්ථාවේ දී) එය මා විසින්ම විසඳා ගැනීමට උත්සාහ කරනවා වෙනුවට එය සැබවින්ම පහත් කොට සලකන ලදි: stackoverflow.com/questions/3060104/… මා තුළ සිටින පුස්තකාලයාධිපතිවරයා ප්‍රීති වේ, ස්තූතියි :)
ඩිමිට්‍රිස් ඇන්ඩ්‍රියෝ

P ඇප්ෆෙල්මස්, මෙය කෙටුම්පතක් බව සලකන්න. (ඇත්ත වශයෙන්ම මම ඔබට දොස් නොකියමි, පොත සොයා ගැනීමට පෙර මම වසරකට ආසන්න කාලයක් සැබෑ දේවල් සඳහා කෙටුම්පත ව්‍යාකූල කළෙමි). Btw සබැඳිය ක්‍රියා නොකළේ නම්, ඔබට books.google.com වෙත ගොස් “මුතුක්‍රිෂ්ණන් දත්ත ප්‍රවාහ ඇල්ගොරිතම” (උපුටා දැක්වීම් නොමැතිව) සෙවිය හැකිය , එය ප්‍රථම වරට උත්පතන වේ.
ඩිමිට්‍රිස් ඇන්ඩෘ

2
මෙහි දක්වා ඇති පිළිතුරු හාස්‍යජනක බැවින් කරුණාකර පහත සඳහන් දේ කියවන්න: stackoverflow.com/questions/4406110/…

174

අපට Q2 විසඳා ගත හැක්කේ සංඛ්‍යා දෙකම සහ සංඛ්‍යා වල වර්ග එකතු කිරීමෙනි.

එවිට අපට ගැටලුව අඩු කළ හැකිය

k1 + k2 = x
k1^2 + k2^2 = y

කොහෙද xසහyඅපේක්ෂිත අගයන්ට වඩා මුදල් කොපමණ දුරක් තිබේද .

ආදේශ කිරීම අපට ලබා දෙන්නේ:

(x-k2)^2 + k2^2 = y

නැතිවූ සංඛ්‍යා තීරණය කිරීම සඳහා අපට විසඳිය හැකි ඒවා.


7
+1; තෝරාගත් අංක සඳහා මම මේපල් හි සූත්‍රය උත්සාහ කර ඇති අතර එය ක්‍රියාත්මක වේ. එය ක්‍රියාත්මක වන්නේ ඇයිදැයි මට තවමත් ඒත්තු ගැන්වීමට නොහැකි විය.
පොලිජෙනෙලබ්‍රිකන්ට්ස්

4
ol පොලිජෙන්ලූබ්‍රිකන්ට්ස්: ඔබට නිරවද්‍යතාවය ඔප්පු කිරීමට අවශ්‍ය නම්, ඔබ මුලින්ම පෙන්වන්නේ එය සැමවිටම නිවැරදි විසඳුමක් සපයන බවයි (එනම්, එය සැමවිටම සංඛ්‍යා යුගලයක් නිපදවන අතර, ඒවා කට්ටලයෙන් ඉවත් කරන විට, එහි ප්‍රති set ලයක් ලෙස කට්ටලයේ ඉතිරි කොටස නිරීක්ෂණය කරන ලද එකතුව සහ වර්ග ප්‍රමාණය). එතැන් සිට, අද්විතීය බව ඔප්පු කිරීම සරල වන්නේ එය නිපදවන්නේ එවැනි සංඛ්‍යා යුගලයක් පමණක් බවයි.
ඇනොන්.

5
සමීකරණවල ස්වභාවය යන්නෙන් ඔබට එම සමීකරණයෙන් k2 අගයන් දෙකක් ලැබෙනු ඇත. කෙසේ වෙතත්, ඔබ k1 උත්පාදනය කිරීමට භාවිතා කරන පළමු පළමු සමීකරණයෙන් ඔබට දැක ගත හැකිය k2 හි මෙම අගයන් දෙකෙන් අදහස් වන්නේ k1 අනෙක් අගය බවයි, එබැවින් ඔබට විසඳුම් දෙකක් ඇති අතර එමඟින් ප්‍රතිවිරුද්ධ දිශාවට සමාන සංඛ්‍යා වේ. ඔබ k1> k2 බව අශිෂ්ට ලෙස ප්‍රකාශ කළහොත් ඔබට ඇත්තේ චතුරස්රාකාර සමීකරණයට එක් විසඳුමක් පමණක් වන අතර සමස්තයක් වශයෙන් එක් විසඳුමක් පමණි. ප්‍රශ්නයේ ස්වභාවය අනුව පිළිතුරක් සැමවිටම පවතින බැවින් එය සැමවිටම ක්‍රියාත්මක වේ.
ක්‍රිස්

3
දී ඇති එකතුවකට k1 + k2, බොහෝ යුගල ඇත. අපට මෙම යුගල K1 = a + b සහ K2 = ab ලෙස ලිවිය හැකිය, එහිදී a = (K1 + k2 / 2). a ලබා දී ඇති මුදලකට අද්විතීය වේ. චතුරස්රවල එකතුව (a + b) ** 2 + (ab) ** 2 = 2 * (a 2 + b 2). ලබා දී ඇති K1 + K2 සඳහා, 2 පදය සවි කර ඇති අතර, b 2 පදය නිසා වර්ගවල එකතුව අද්විතීය වන බව අපට පෙනේ . එබැවින්, පූර්ණ සංඛ්‍යා යුගලයක් සඳහා x සහ y අගයන් අද්විතීය වේ.
phkahler

8
මේක නම් නියමයි. 32 user3281743 මෙන්න උදාහරණයක්. නැතිවූ සංඛ්‍යා (k1 සහ k2) 4 සහ 6 විය යුතුය. එකතුව (1 -> 10) = 55 සහ එකතුව (1 ^ 2 -> 10 ^ 2) = 385. දැන් x = 55 - (එකතුව (ඉතිරි සියලුම සංඛ්‍යා) )) සහ y = 385 - (එකතුව (ඉතිරි සියලු සංඛ්‍යා වල වර්ග)) මේ අනුව x = 10 සහ y = 52. අපට පෙන්වා ඇති පරිදි ආදේශ කරන්න: (10 - k2) ^ 2 + k2 ^ 2 = 52 ඔබට හැකි සරල කරන්න: 2k ^ 2 - 20k + 48 = 0. චතුරස්රාකාර සමීකරණය විසඳීම මඟින් ඔබට පිළිතුර 4 සහ 6 ලබා දේ.
ඇලෙක්ස්කෝරන්

138

_J_random_hacker පෙන්වා දුන් පරිදි, මෙය O (n) වේලාව සහ O (1) අවකාශයේ අනුපිටපත් සොයා ගැනීමට බෙහෙවින් සමාන ය. වන අතර මගේ පිළිතුර අනුවර්තනය වීමක් ද මෙහි ක්‍රියාත්මක වේ.

"බෑගය" 1 පාදක A[]ප්‍රමාණයේ විශාලත්වයකින් නිරූපණය වන බව උපකල්පනය කිරීමෙන් N - k, අපට O(N)කාලය සහ O(k)අමතර අවකාශය තුළ Qk විසඳිය හැකිය .

පළමුව, අපට අපගේ මාලාවක් දීර්ඝ A[]විසින් k, මූලද්රව්ය එය ප්රමාණයෙන් දැන් එසේ බව N. මෙය O(k)අතිරේක අවකාශයයි. ඉන්පසු අපි පහත ව්‍යාජ කේත ඇල්ගොරිතම ක්‍රියාත්මක කරමු:

for i := n - k + 1 to n
    A[i] := A[1]
end for

for i := 1 to n - k
    while A[A[i]] != A[i] 
        swap(A[i], A[A[i]])
    end while
end for

for i := 1 to n
    if A[i] != i then 
        print i
    end if
end for

පළමු පුඩුවක් initialises kඅරාව තුළ පළමු ප්රවේශය මෙන් ම සඳහා අමතර ප්රවේශයන් (මෙම පමණක් බව අපි දන්නේ පහසු අගය අරාව මේවන විටත් ඇත - මෙම පියවර පසුව, ප්රමාණය ආරම්භක සැරසී අතුරුදන් වී ඇති ඕනෑම සටහන් N-kවේ විස්තාරිත අරාවෙහි තවමත් නොමැත).

දෙවන ලූපය දීර් extended කරන ලද අරාව සඳහා අවසර දෙයි x, එවිට මූලද්‍රව්‍යය අවම වශයෙන් එක් වරක්වත් තිබේ නම්, එම ඇතුළත් කිරීම් වලින් එකක් ස්ථානගත වේA[x] වේ.

එය පිළිතුරු පැතැලිව පුඩුවක් සිටියත්, එය තවමත් දිවෙන සටහන O(N)ඉතා වැදගත් නම් පමණක් සිදුවේ ස්වැප් - කාලය i, එවන් A[i] != iඅතර, එක් එක් හුවමාරු කට්ටල අවම වශයෙන් එක් අංගයක්, එවන් A[i] == i, ඊට පෙර සැබෑ නොවන තැන. මෙයින් අදහස් කරන්නේ මුළු හුවමාරු සංඛ්‍යාව (සහ මේ අනුව whileලූප් ශරීරයේ මුළු ක්‍රියාත්මක කිරීම් ගණන ) බොහෝ දුරට N-1බවයි.

තෙවන ලූපය මඟින් අරාවෙහි දර්ශක අගය මුද්‍රණය iනොකෙරේ i- මෙයින් අදහස් වන්නේ iනැතිවී තිබිය යුතු බවයි.


4
ඉතා සුළු පිරිසක් මෙම පිළිතුරට ඡන්දය දුන් අතර එය නිවැරදි පිළිතුරක් ලෙස සලකුණු නොකළේ මන්දැයි මම කල්පනා කරමි. මෙන්න පයිතන් හි කේතය. එය O (n) වේලාවෙන් ධාවනය වන අතර අමතර ඉඩ O (k) අවශ්‍ය වේ. pastebin.com/9jZqnTzV
wall-e

3
@caf මෙය බිටු සැකසීමට හා බිට් 0 ඇති ස්ථාන ගණනය කිරීමට බෙහෙවින් සමාන ය. තවද මම සිතන්නේ ඔබ නිඛිල අරා නිර්මාණය කරන විට වැඩි මතකයක් ඇති බවයි.
ෆොක්ස්

5
"බිටු සැකසීම සහ බිට් 0 ඇති ස්ථාන ගණනය කිරීම" සඳහා O (n) අමතර ඉඩක් අවශ්‍ය වේ, මෙම විසඳුම මඟින් O (k) අමතර ඉඩ භාවිතා කරන ආකාරය පෙන්වයි.
කැෆේ

7
ධාරාවන් ආදානය ලෙස ක්‍රියා නොකරන අතර ආදාන අරාව වෙනස් කරයි (මම එයට බෙහෙවින් කැමති නමුත් අදහස ful ලදායී වුවද).
comco

3
@ v.oddou: නෑ, ඒක හොඳයි. හුවමාරුව වෙනස් වනු ඇත A[i], එයින් අදහස් වන්නේ ඊළඟ නැවත සිදු කිරීම පෙර අගයට සමාන අගයන් දෙක සංසන්දනය නොකරන බවයි. අළුත් A[i]අන්තිම ලූපයට සමාන වනු ඇත A[A[i]], නමුත් නව අගය නව අගයක් A[A[i]]වනු ඇත . එය උත්සාහ කර බලන්න.
කැෆේ

130

මෙම ගැටළුව විසඳන ලෙස මම අවුරුදු 4 ක දරුවෙකුගෙන් ඉල්ලා සිටියෙමි. ඔහු අංක වර්ග කර පසුව ගණන් කළේය. මෙය O (මුළුතැන්ගෙය) සඳහා අවකාශ අවශ්‍යතාවයක් ඇති අතර බොහෝ බෝල අතුරුදහන් වුවද එය පහසු ලෙස ක්‍රියා කරයි.


20
;) ඔබේ 4 හැවිරිදි දරුවා 5 හෝ / වෙත ළඟා විය යුතු අතර එය දක්ෂයෙකි. මගේ 4 හැවිරිදි දියණියට තවමත් 4 ට නිසි ලෙස ගණන් ගත නොහැක. හොඳයි, අපි කියමු ඇය යන්තම් අවසානයේ "4" හි පැවැත්ම ඒකාබද්ධ කළාය. එසේ නොමැතිනම් මේ වන තෙක් ඇය එය මඟ හරිනු ඇත. "1,2,3,5,6,7" ඇගේ සුපුරුදු ගණන් කිරීමේ අනුක්‍රමය විය. පැන්සල් එකට එකතු කරන ලෙස මම ඇයගෙන් ඉල්ලා සිටියෙමි. ඇය මුල සිටම 1 + 2 = 3 කළමනාකරණය කරයි. මට ඇත්තෙන්ම කණගාටුයි ...: '(
මෙහ්

සරල නමුත් effective ලදායී ප්‍රවේශයකි.
PabTorre

6
ඕ (මුළුතැන්ගෙයි මහල) හාහා - නමුත් එය ඕ (එන් ^ 2) නොවේද?

13
O (m²) මම අනුමාන කරමි :)
වික්ටර් මෙල්ග්‍රන්

1
ucphuclv: පිළිතුරෙහි සඳහන් වූයේ "මේ සඳහා O (මුළුතැන්ගෙයි තට්ටුවේ) අවකාශයක් අවශ්‍ය බවයි". කෙසේ වෙතත්, මෙය O (n) කාලය තුළ වර්ග කිරීම සාක්ෂාත් කරගත හැකි අවස්ථාවකි --- මෙම සාකච්ඡාව බලන්න .
ඇන්තනි ලැබාරේ

37

එය වඩාත්ම කාර්යක්ෂම විසඳුම නම්, නමුත් මම සියලු ඇතුළත් කිරීම් ඉක්මවා ගොස් මතක තබා ගැනීම සඳහා බිට්සෙට් එකක් භාවිතා කරමි, කුමන සංඛ්‍යා සකසා ඇත්දැයි සහ පසුව බිටු 0 සඳහා පරීක්ෂා කරන්න.

මම සරල විසඳුම් වලට කැමතියි - තවද එය එකතුව හෝ වර්ග ප්‍රමාණය ගණනය කිරීමට වඩා වේගවත් විය හැකි යැයි මම විශ්වාස කරමි.


11
I did propose this obvious answer, but this is not what the interviewer wanted. I explicitly said in the question that this is not the answer I'm looking for. Another obvious answer: sort first. Neither the O(N) counting sort nor O(N log N) comparison sort is what I'm looking for, although they are both very simple solutions.
polygenelubricants

ol පොලිජෙන්ලූබ්‍රිකන්ට්ස්: ඔබේ ප්‍රශ්නයේදී ඔබ එය කී ස්ථානය මට සොයාගත නොහැක. ඔබ බිට්සෙට් ප්‍රති result ලය ලෙස සලකන්නේ නම්, දෙවන වර්‍ගය නොමැත. සංකීර්ණතාව යනු (සම්මුඛ පරීක්‍ෂකවරයා පවසන පරිදි N යනු නියත යැයි අපි සලකන්නේ නම්, සංකීර්ණතාව " k නොව N වලින් අර්ථ දක්වා ඇත ") O (1), සහ ඔබට වඩාත් "පිරිසිදු" ප්‍රති result ලයක් තැනීමට අවශ්‍ය නම්, ඔබ පිරිසිදු ප්‍රති .ලය නිර්මාණය කිරීම සඳහා ඔබට සැමවිටම O (k) අවශ්‍ය වන නිසා ඔබට ලබා ගත හැකි හොඳම දේ O (k) ලබා ගන්න.
ක්‍රිස් ලර්චර්

"මම පැහැදිලි සෙට්-පදනම් විසඳුමක් සොයන්නේ නැති බව සලකන්න (උදා: ටිකක් කට්ටලයක් භාවිතා කිරීම,". මුල් ප්‍රශ්නයේ දෙවන අවසාන ඡේදය.
hrnt

9
@hmt: ඔව්, ප්‍රශ්නය මිනිත්තු කිහිපයකට පෙර සංස්කරණය කරන ලදි. සම්මුඛ පරීක්‍ෂකවරයකුගෙන් මා බලාපොරොත්තු වන පිළිතුර මම ලබා දෙමි ... කෘතිමව උප ප්‍රශස්ත විසඳුමක් සාදමින් (ඔබට O (n) + O (k) වේලාව පරාජය කළ නොහැක, ඔබ කුමක් කළත්) නැත. මට තේරුමක් නැත - ඔබට O (n) අමතර ඉඩක් ලබා දිය නොහැකි නම් හැර, නමුත් ප්‍රශ්නය ඒ පිළිබඳ පැහැදිලි නැත.
ක්‍රිස් ලර්චර්

3
වැඩිදුර පැහැදිලි කිරීම සඳහා මම නැවත ප්‍රශ්නය සංස්කරණය කළෙමි. ප්‍රතිපෝෂණය / පිළිතුර මම අගය කරමි.
පොලිජෙනෙලබ්‍රිකන්ට්ස්

33

මම ගණිතය පරික්ෂා කර නැත, නමුත් Σ(n^2)අප ගණනය කරන ආකාරයටම එකම ගණනය කිරීමකින් Σ(n)අතුරුදහන් වූ සංඛ්‍යා දෙකක් ලබා ගැනීමට ප්‍රමාණවත් තොරතුරු ලැබෙනු ඇතැයි මම සැක කරමි Σ(n^3), තුනක් තිබේ නම් කරන්න, සහ එසේ කරන්න.


15

සංඛ්‍යා එකතුව මත පදනම් වූ විසඳුම් පිළිබඳ ගැටළුව වන්නේ විශාල on ාතකයන් සමඟ සංඛ්‍යා ගබඩා කිරීම හා වැඩ කිරීමේ පිරිවැය ඔවුන් සැලකිල්ලට නොගැනීමයි ... ප්‍රායෝගිකව එය ඉතා විශාල n සඳහා වැඩ කිරීම සඳහා විශාල සංඛ්‍යා පුස්තකාලයක් භාවිතා කරනු ඇත . මෙම ඇල්ගොරිතම සඳහා අවකාශය භාවිතා කිරීම අපට විශ්ලේෂණය කළ හැකිය.

Sdcvvc සහ Dimitris Andreou ගේ ඇල්ගොරිතම වල කාලය හා අවකාශයේ සංකීර්ණතාවය අපට විශ්ලේෂණය කළ හැකිය.

ගබඞා:

l_j = ceil (log_2 (sum_{i=1}^n i^j))
l_j > log_2 n^j  (assuming n >= 0, k >= 0)
l_j > j log_2 n \in \Omega(j log n)

l_j < log_2 ((sum_{i=1}^n i)^j) + 1
l_j < j log_2 (n) + j log_2 (n + 1) - j log_2 (2) + 1
l_j < j log_2 n + j + c \in O(j log n)`

නිසා l_j \in \Theta(j log n)

භාවිතා කළ මුළු ගබඩාව: \sum_{j=1}^k l_j \in \Theta(k^2 log n)

භාවිතා කළ අවකාශය: පරිගණකයට කාලය a^jගතවේ යැයි උපකල්පනය කරමින් ceil(log_2 j), මුළු කාලය:

t = k ceil(\sum_i=1^n log_2 (i)) = k ceil(log_2 (\prod_i=1^n (i)))
t > k log_2 (n^n + O(n^(n-1)))
t > k log_2 (n^n) = kn log_2 (n)  \in \Omega(kn log n)
t < k log_2 (\prod_i=1^n i^i) + 1
t < kn log_2 (n) + 1 \in O(kn log n)

භාවිතා කළ මුළු කාලය: \Theta(kn log n)

මෙම කාලය සහ අවකාශය සතුටුදායක නම්, ඔබට සරල පුනරාවර්තන ඇල්ගොරිතමයක් භාවිතා කළ හැකිය. B! I බෑගයේ ඇති ith ප්‍රවේශයද, n ඉවත් කිරීමට පෙර සංඛ්‍යා ගණනද, k ඉවත් කිරීමේ ගණනද වේ. හැස්කෙල් සින්ටැක්ස් වල ...

let
  -- O(1)
  isInRange low high v = (v >= low) && (v <= high)
  -- O(n - k)
  countInRange low high = sum $ map (fromEnum . isInRange low high . (!)b) [1..(n-k)]
  findMissing l low high krange
    -- O(1) if there is nothing to find.
    | krange=0 = l
    -- O(1) if there is only one possibility.
    | low=high = low:l
    -- Otherwise total of O(knlog(n)) time
    | otherwise =
       let
         mid = (low + high) `div` 2
         klow = countInRange low mid
         khigh = krange - klow
       in
         findMissing (findMissing low mid klow) (mid + 1) high khigh
in
  findMising 1 (n - k) k

භාවිතා කරන ආචයනය: O(k)ලැයිස්තුව O(log(n))සඳහා, තොග සඳහා: O(k + log(n)) මෙම ඇල්ගොරිතම වඩාත් බුද්ධිමත්, එකම කාල සංකීර්ණත්වයක් ඇති අතර අඩු ඉඩ ප්‍රමාණයක් භාවිතා කරයි.


1
+1, ලස්සනයි, නමුත් ස්නිපෙට් # 1 හි 4 වන පේළියේ සිට 5 වන පේළියට යාම ඔබට අහිමි විය - ඔබට එය තවදුරටත් පැහැදිලි කළ හැකිද? ස්තූතියි!
j_random_hacker

isInRangeවන සාමාන්ය (n-සටහන) නොව, සාමාන්ය (1) : එය අංක පරාසය 1..n දී, එය සංසන්දනය කිරීමට ඇති නිසා සංසන්දනය සාමාන්ය (n-සටහන) බිටු. මෙම දෝෂය අනෙක් විශ්ලේෂණයට කොතරම් දුරට බලපාන්නේදැයි මම නොදනිමි.
jcsahnwaldt මොනිකා

14

විනාඩියක් ඉන්න. ප්රශ්නය ප්රකාශ කර ඇති පරිදි, බෑගයේ අංක 100 ක් ඇත. කොතරම් විශාල k වුවත්, ගැටළුව නියත වේලාවක විසඳා ගත හැකි වන්නේ ඔබට කට්ටලයක් භාවිතා කළ හැකි අතර ලූපයක උපරිම 100 - k පුනරාවර්තන වලින් කට්ටලයෙන් සංඛ්‍යා ඉවත් කළ හැකිය. 100 නියතයි. ඉතිරි අංක කට්ටලය ඔබේ පිළිතුරයි.

අපි 1 සිට N දක්වා සංඛ්‍යා සඳහා විසඳුම සාමාන්‍යකරණය කළහොත්, N හැර වෙන කිසිවක් වෙනස් නොවේ නියතයක් නොවේ, එබැවින් අපි O (N - k) = O (N) වේලාවේ සිටිමු. උදාහරණයක් ලෙස, අපි ටිකක් කට්ටලයක් භාවිතා කරන්නේ නම්, අපි බිටු O (N) වේලාවට 1 ක් ලෙස සකසා, සංඛ්‍යා හරහා පුනරාවර්තනය කර, අප යන විට (O (Nk) = O (N)) බිටු 0 ලෙස සකසා පසුව අපි පිළිතුර ඇත.

O (N) වේලාවට වඩා O (k) වේලාවේ අවසාන කට්ටලයේ අන්තර්ගතය මුද්‍රණය කරන්නේ කෙසේදැයි සම්මුඛ පරීක්ෂක ඔබෙන් විමසූ බව මට පෙනේ . පැහැදිලිවම, ටිකක් කට්ටලයක් සමඟ, ඔබ අංකය මුද්‍රණය කළ යුතුද නැද්ද යන්න තීරණය කිරීම සඳහා සියලු N බිටු හරහා නැවත යෙදිය යුතුය. කෙසේ වෙතත්, ඔබ කට්ටලය ක්‍රියාත්මක කරන ආකාරය වෙනස් කළහොත් ඔබට k පුනරාවර්තනවල අංක මුද්‍රණය කළ හැකිය. මෙය සිදු කරනුයේ හැෂ් කට්ටලයක සහ දෙගුණයක් සම්බන්ධිත ලැයිස්තුවක ගබඩා කළ යුතු වස්තුවකට සංඛ්‍යා ඇතුළත් කිරීමෙනි. ඔබ හැෂ් කට්ටලයෙන් වස්තුවක් ඉවත් කළ විට, ඔබ එය ලැයිස්තුවෙන් ඉවත් කරන්න. දැන් දිග k ඇති ලැයිස්තුවේ පිළිතුරු ඉතිරි වේ.


9
මෙම පිළිතුර ඉතා සරල ය, සරල පිළිතුරු ක්‍රියාත්මක නොවන බව අපි කවුරුත් දනිමු! ;) බරපතල ලෙස වුවද, මුල් ප්‍රශ්නය බොහෝ විට O (k) අවකාශයේ අවශ්‍යතාව අවධාරණය කළ යුතුය.
ඩී.කේ.

ගැටළුව එය සරල නොවන නමුත් සිතියම සඳහා ඔබට O (n) අතිරේක මතකය භාවිතා කිරීමට සිදුවනු ඇත. ගැටලුව මට නිරන්තර වේලාව හා නිරන්තර මතකය මගින් විසඳා ඇත
මොජෝ රිසින්

3
අවම විසඳුම අවම වශයෙන් O (N) බව ඔබට ඔප්පු කළ හැකි යැයි මම සිතමි. අඩු නිසා, එයින් අදහස් වන්නේ ඔබ සමහර සංඛ්‍යා දෙස බැලුවේ නැති බවත්, ඇණවුමක් නිශ්චිතව දක්වා නොමැති නිසා, සියලු අංක දෙස බැලීම අනිවාර්ය බවත්ය.
v.oddou

අපි ආදානය ප්‍රවාහයක් ලෙස බැලුවහොත් සහ n මතකයේ තබා ගැනීමට නොහැකි තරම් විශාල නම්, O (k) මතක අවශ්‍යතාව අර්ථවත් කරයි. අපට තවමත් හැෂිං භාවිතා කළ හැකිය: k ^ 2 බාල්දි සාදා ඒවායින් එක් එක් සරල ඇල්ගොරිතම භාවිතා කරන්න. එය k ^ 2 මතකයක් පමණක් වන අතර සාර්ථකත්වයේ ඉහළ සම්භාවිතාවක් ලබා ගැනීම සඳහා තවත් බාල්දි කිහිපයක් භාවිතා කළ හැකිය.
තෝමස් අහ්

8

නැතිවූ අංක 2 (සහ 3) ප්‍රශ්නය විසඳීම සඳහා, ඔබට වෙනස් කළ හැකිය quickselect, එය සාමාන්‍යයෙන් ක්‍රියාත්මක වන අතර O(n)කොටස් කිරීම නිසි පරිදි සිදු කරන්නේ නම් නියත මතකය භාවිතා කරයි.

  1. සසම්භාවී හැරීමකට සාපේක්ෂව කට්ටලය කොටස් pවලට බෙදන්න l, එය හැරීමට වඩා කුඩා සංඛ්‍යා අඩංගු වන අතර, හැරීමට rවඩා විශාල සංඛ්‍යා අඩංගු වේ.

  2. හැරීමේ අගය එක් එක් කොටසේ ප්‍රමාණයට ( p - 1 - count(l) = count of missing numbers in lසහ n - count(r) - p = count of missing numbers in r) සංසන්දනය කිරීමෙන් අතුරුදහන් වූ අංක 2 ඇත්තේ කුමන කොටස්ද යන්න තීරණය කරන්න.

  3. අ) සෑම කොටසකටම එක් අංකයක් අස්ථානගත වී ඇත්නම්, නැතිවූ සෑම අංකයක්ම සොයා ගැනීම සඳහා මුදල් ප්‍රවේශයේ වෙනස භාවිතා කරන්න.

    (1 + 2 + ... + (p-1)) - sum(l) = missing #1 සහ ((p+1) + (p+2) ... + n) - sum(r) = missing #2

    ආ) එක් කොටසක අංක දෙකම අස්ථානගත වී ඇති අතර කොටස හිස් නම්, නැතිවූ සංඛ්‍යා එක්කෝ (p-1,p-2)හෝ (p+1,p+2) කුමන කොටසේ සංඛ්‍යා අස්ථානගත වී ඇත්ද යන්න මත පදනම්ව.

    එක් කොටසකට අංක 2 ක් නැති නමුත් හිස් නොවේ නම්, එම කොටසට නැවත යොමු වන්න.

නැතිවූ අංක 2 ක් පමණක් ඇති මෙම ඇල්ගොරිතම සෑම විටම අවම වශයෙන් එක් කොටසක් වත් ඉවතලයි, එබැවින් එය රඳවා ගනී O(n) ඉවතලයි ඉක්මන් තේරීමේ සාමාන්‍ය කාල සංකීර්ණත්වය . ඒ හා සමානව, අතුරුදහන් වූ අංක 3 ක් සමඟ මෙම ඇල්ගොරිතමය එක් එක් මුරපදය සමඟ අවම වශයෙන් එක් කොටසක් වත් ඉවතලයි (මක්නිසාද යත්, අතුරුදහන් වූ අංක 2 ක් මෙන්, බොහෝ විට 1 කොටසෙහි පමණක් අතුරුදහන් වූ සංඛ්‍යා කිහිපයක් අඩංගු වේ). කෙසේ වෙතත්, තවත් අතුරුදහන් වූ සංඛ්‍යා එකතු කළ විට කාර්ය සාධනය කොතරම් අඩු වේදැයි මට විශ්වාස නැත.

මෙතන නැති බව ක ක්රියාත්මක වේ නොහැකි , දී-ස්ථානය කොටස් භාවිතා ඒ නිසා මෙම උදාහරණයක් අවකාශය අවශ්යතා සපුරා නැත නමුත් එය ඇල්ගොරිතමය ඇති පියවර පැහැදිලි වන්නේ කුමක්ද:

<?php

  $list = range(1,100);
  unset($list[3]);
  unset($list[31]);

  findMissing($list,1,100);

  function findMissing($list, $min, $max) {
    if(empty($list)) {
      print_r(range($min, $max));
      return;
    }

    $l = $r = [];
    $pivot = array_pop($list);

    foreach($list as $number) {
      if($number < $pivot) {
        $l[] = $number;
      }
      else {
        $r[] = $number;
      }
    }

    if(count($l) == $pivot - $min - 1) {
      // only 1 missing number use difference of sums
      print array_sum(range($min, $pivot-1)) - array_sum($l) . "\n";
    }
    else if(count($l) < $pivot - $min) {
      // more than 1 missing number, recurse
      findMissing($l, $min, $pivot-1);
    }

    if(count($r) == $max - $pivot - 1) {
      // only 1 missing number use difference of sums
      print array_sum(range($pivot + 1, $max)) - array_sum($r) . "\n";
    } else if(count($r) < $max - $pivot) {
      // mroe than 1 missing number recurse
      findMissing($r, $pivot+1, $max);
    }
  }

නිරූපණය


කට්ටලය කොටස් කිරීම රේඛීය අවකාශය භාවිතා කිරීමක් වැනිය. අවම වශයෙන් එය ප්‍රවාහ සැකසුමක ක්‍රියා නොකරනු ඇත.
තෝමස් අහ්

H තෝමස්ආල් බලන්න en.wikipedia.org/wiki/Selection_algorithm#Space_complexity . කට්ටලය ස්ථානගත කිරීම සඳහා අවශ්‍ය වන්නේ O (1) අමතර ඉඩක් පමණි - රේඛීය අවකාශය නොවේ. ප්‍රවාහ සැකසුමක දී එය O (k) අමතර ඉඩක් වනු ඇත, කෙසේ වෙතත්, මුල් ප්‍රශ්නයේ දී ප්‍රවාහය සඳහන් නොවේ.
FuzzyTree

කෙලින්ම නොවේ, නමුත් ඔහු ලියන්නේ "ඔබ O (N) හි ආදානය පරිලෝකනය කළ යුතුය, නමුත් ඔබට ග්‍රහණය කර ගත හැක්කේ කුඩා තොරතුරු ප්‍රමාණයක් පමණි (k නොවන N අනුව අර්ථ දක්වා ඇත)" එය සාමාන්‍යයෙන් ප්‍රවාහයේ අර්ථ දැක්වීමයි. ඔබට N ප්‍රමාණයේ පරාසයක් නොමැති නම්, කොටස් කිරීම සඳහා සියලු සංඛ්‍යා ගෙනයාම සැබවින්ම කළ නොහැක්කකි. ප්‍රශ්නයට පිළිතුරු රාශියක් ඇති බැවින් මායාකාරිය මෙම බාධකය නොසලකා හරින බවක් පෙනේ.
තෝමස් අහ්

1
නමුත් ඔබ පවසන පරිදි, වැඩි සංඛ්‍යාවක් එකතු වන විට කාර්ය සාධනය අඩු විය හැකිද? සෑම විටම පරිපූර්ණ කප්පාදුවක් ලබා ගැනීම සඳහා අපට රේඛීය කාල මධ්‍යන්‍ය ඇල්ගොරිතම භාවිතා කළ හැකිය, නමුත් k සංඛ්‍යා 1, ..., n වලින් හොඳින් ව්‍යාප්ත වී ඇත්නම්, ඔබ කප්පාදු කිරීමට පෙර "ගැඹුරු" ලොග් මට්ටම් ගැන යා යුතු නොවේ. අතු තිබේද?
තෝමස් අහ්

2
නරකම තත්වයේ ධාවන කාලය සැබවින්ම අවහිර වන්නේ ඔබ බොහෝ ලොග් වේලාවන්හි සම්පූර්ණ ආදානය සැකසීමට අවශ්‍ය නිසා වන අතර පසුව එය ජ්‍යාමිතික අනුක්‍රමයකි (බොහෝ මූලද්‍රව්‍ය වලින් ආරම්භ වන). සරල පුනරාවර්තනයකින් ක්‍රියාත්මක වන විට අවකාශයේ අවශ්‍යතා සටහන් වේ, නමුත් ඒවා සත්‍ය ඉක්මන් තේරීමක් ක්‍රියාත්මක කිරීමෙන් සහ එක් එක් කොටසේ නිවැරදි දිග සහතික කිරීමෙන් O (1) බවට පත් කළ හැකිය.
emu

7

මෙන්න උපායශීලී උපක්‍රමයකින් තොරව සරල ගබඩා කිරීම සඳහා k බිටු අමතර ගබඩා භාවිතා කරන විසඳුමක්. ක්‍රියාත්මක කිරීමේ කාලය O (n), අමතර ඉඩ O (k). පළමුවෙන්ම විසඳුම කියවීමෙන් හෝ බුද්ධිමතෙකු නොවී මෙය විසඳිය හැකි බව ඔප්පු කිරීම සඳහා:

void puzzle (int* data, int n, bool* extra, int k)
{
    // data contains n distinct numbers from 1 to n + k, extra provides
    // space for k extra bits. 

    // Rearrange the array so there are (even) even numbers at the start
    // and (odd) odd numbers at the end.
    int even = 0, odd = 0;
    while (even + odd < n)
    {
        if (data [even] % 2 == 0) ++even;
        else if (data [n - 1 - odd] % 2 == 1) ++odd;
        else { int tmp = data [even]; data [even] = data [n - 1 - odd]; 
               data [n - 1 - odd] = tmp; ++even; ++odd; }
    }

    // Erase the lowest bits of all numbers and set the extra bits to 0.
    for (int i = even; i < n; ++i) data [i] -= 1;
    for (int i = 0; i < k; ++i) extra [i] = false;

    // Set a bit for every number that is present
    for (int i = 0; i < n; ++i)
    {
        int tmp = data [i];
        tmp -= (tmp % 2);
        if (i >= even) ++tmp;
        if (tmp <= n) data [tmp - 1] += 1; else extra [tmp - n - 1] = true;
    }

    // Print out the missing ones
    for (int i = 1; i <= n; ++i)
        if (data [i - 1] % 2 == 0) printf ("Number %d is missing\n", i);
    for (int i = n + 1; i <= n + k; ++i)
        if (! extra [i - n - 1]) printf ("Number %d is missing\n", i);

    // Restore the lowest bits again.
    for (int i = 0; i < n; ++i) {
        if (i < even) { if (data [i] % 2 != 0) data [i] -= 1; }
        else { if (data [i] % 2 == 0) data [i] += 1; }
    }
}

ඔබට අවශ්‍යද (data [n - 1 - odd] % 2 == 1) ++odd;?
චාල්ස්

2
මෙය ක්‍රියාත්මක වන ආකාරය ඔබට පැහැදිලි කළ හැකිද? මට තේරෙන්නේ නැහැ.
Teepeemm

තාවකාලික ගබඩා කිරීම සඳහා මට (n + k) බූලියන් සමූහයක් භාවිතා කළ හැකි නම් විසඳුම ඉතා සරල වනු ඇත, නමුත් එයට අවසර නැත. ඒ නිසා මම දත්ත නැවත සකස් කර, ආරම්භයේ ඉරට්ටේ සංඛ්‍යා සහ අරාව අවසානයේ අමුතු සංඛ්‍යා තබමි. දැන් එම සංඛ්‍යා වල අඩුම බිටු තාවකාලික ගබඩා කිරීම සඳහා භාවිතා කළ හැකිය, මන්ද ඉරට්ටේ හා අමුතු සංඛ්‍යා කීයක් තිබේදැයි මම දනිමි. මෙම n බිටු සහ k අමතර බිටු හරියටම මට අවශ්‍ය (n + k) බූලියන් වේ.
gnasher729

2
දත්ත මතකයේ තබා ගැනීමට නොහැකි තරම් විශාල නම් මෙය ක්‍රියා නොකරනු ඇති අතර ඔබ එය දුටුවේ ධාරාවක් ලෙස පමණි. රසවත් ලෙස හැක් වුවද :)
තෝමස් අහ්

අවකාශයේ සංකීර්ණතාව O (1) විය හැකිය. පළමු වර්‍ගයේදී, ඔබ 'අමතර' භාවිතා නොකර සියලුම සංඛ්‍යා <(n - k) හරියටම මෙම ඇල්ගොරිතමයෙන් සකසයි. දෙවන වර්‍ගයේදී, ඔබ නැවත සමානාත්මතා බිටු ඉවත් කර අංක (nk) සුචිගත කිරීම සඳහා පළමු k ස්ථාන භාවිතා කරයි .. (n).
emu

5

සෑම අංකයක්ම තිබේදැයි පරීක්ෂා කළ හැකිද? ඔව් නම් ඔබට මෙය උත්සාහ කළ හැකිය:

S = බෑගයේ ඇති සියලුම සංඛ්‍යා එකතුව (S <5050)
Z = නැතිවූ අංකවල එකතුව 5050 - S.

නැතිවූ අංක නම් xසහ y:

x = Z - y සහ
උපරිම (x) = Z - 1

ඒ නිසා ඔබ දක්වා පරාසයේ පරීක්ෂා 1කිරීමට max(x)සහ සංඛ්යාව සොයා


2
කුමක්ද කරන්නේ max(x)නපුරු, විට xගණනාවක් ද?
තෝමස් අහ්

2
ඔහු බොහෝ විට අදහස් කරන්නේ සංඛ්‍යා
සමූහයෙන් උපරිමයි

අපට සංඛ්‍යා 2 ට වඩා තිබේ නම් මෙම විසඳුම
කඩාවැටෙනු

4

Q2 සඳහා මෙය අනෙක් ඒවාට වඩා මඳක් අකාර්යක්ෂම විසඳුමකි, නමුත් තවමත් O (N) ධාවන කාලය ඇති අතර O (k) අවකාශය ගනී.

අදහස නම් මුල් ඇල්ගොරිතම දෙවරක් ධාවනය කිරීමයි. පළමු එකෙහි ඔබට නැතිවූ මුළු සංඛ්‍යාවක් ලැබෙනු ඇත, එමඟින් ඔබට නැතිවූ අංකවල ඉහළ සීමාවක් ලබා දේ. අපි මෙම අංකයට කතා කරමු N. නැතිවූ අංක දෙක එකතුවට යන බව ඔබ දන්නවා N, එබැවින් පළමු අංකය විය හැක්කේ කාල පරතරය තුළ වන [1, floor((N-1)/2)]අතර දෙවැන්න ඇතුලත් වේ [floor(N/2)+1,N-1].

පළමු පරතරයට ඇතුළත් කර නොමැති සියලුම සංඛ්‍යා ඉවතලමින් ඔබ නැවත වරක් සියලු සංඛ්‍යා මත ලූප් කරයි. ඒවා නම්, ඔබ ඒවායේ එකතුව නිරීක්ෂණය කරයි. අවසාන වශයෙන්, නැතිවූ අංක දෙකෙන් එකක් ඔබ දැන ගනු ඇත, දෙවන දිගුව දීර් extension කිරීමෙන්.

මෙම ක්‍රමය සාමාන්‍යකරණය කළ හැකි යැයි මට හැඟී ඇති අතර ආදානය හරහා එක් වර්‍ගයක් තුළදී බහු සෙවුම් "සමාන්තරව" ක්‍රියාත්මක වේ, නමුත් කෙසේ දැයි මම තවම සොයාගෙන නැත.


අහාහා ඔව් මම Q2 සඳහා ඉදිරිපත් කළ එකම විසඳුම මෙයයි, N / 2 ට වඩා අඩු සියලු සංඛ්‍යා සඳහා සෘණ ගෙන නැවත එකතුව ගණනය කිරීමෙන් , නමුත් මෙය ඊටත් වඩා හොඳයි!
xjcl

4

මෙම ඇල්ගොරිතම 1 වන ප්‍රශ්නය සඳහා ක්‍රියා කළ හැකිය:

  1. පළමු නිඛිල 100 හි xor පූර්ව ගණනය කරන්න (val = 1 ^ 2 ^ 3 ^ 4 .... 100)
  2. මූලද්‍රව්‍ය ආදාන ප්‍රවාහයෙන් එන විට xor කරන්න (val1 = val1 ^ next_input)
  3. අවසාන පිළිතුර = අගය ^ val1

හෝ ඊටත් වඩා හොඳ:

def GetValue(A)
  val=0
  for i=1 to 100
    do
      val=val^i
    done
  for value in A:
    do
      val=val^value 
    done
  return val

මෙම ඇල්ගොරිතම ඇත්ත වශයෙන්ම අතුරුදහන් වූ සංඛ්‍යා දෙකක් සඳහා පුළුල් කළ හැකිය. පළමු පියවර එලෙසම පවතී. නැතිවූ අංක දෙකක් සමඟ අපි GetValue අමතන විට එහි ප්‍රති result ලය a1^a2වනුයේ නැතිවූ අංක දෙකයි. කියමු

val = a1^a2

දැන් වෝල්ටීයතාවයෙන් a1 සහ a2 ඉවත් කිරීම සඳහා අපි ඕනෑම කට්ටලයක් අගය ගනිමු. ithබිට් අගය කපා ඇති බව කියමු . ඒ කියන්නේ a1 සහ a2 ithබිට් ස්ථානයේ වෙනස් සමානාත්මතාවයක් ඇති බවයි. දැන් අපි මුල් අරාව මත තවත් පුනරාවර්තනයක් කර xor අගයන් දෙකක් තබා ගනිමු. එකක් ith bit කට්ටලය ඇති සංඛ්‍යා සඳහා වන අතර අනෙක ith bit set නොමැති. අපට දැන් අංක බාල්දි දෙකක් ඇති අතර එහි සහතිකය a1 and a2විවිධ බාල්දි වල අඩංගු වේ. දැන් එක් එක් බාල්දියේ නැතිවූ එක් අංගයක් සොයා ගැනීම සඳහා අප කළ දේම නැවත කරන්න.


මෙය විසඳන්නේ ගැටලුව සඳහා පමණයි k=1, නේද? නමුත් මම xorවැඩිපුර මුදල් භාවිතා කිරීමට කැමතියි , එය ටිකක් වේගවත් බව පෙනේ.
තෝමස් අහ්

H තෝමස් අහ් ඔව්. මම එය මගේ පිළිතුරෙන් ප්‍රකාශ කර ඇත්තෙමි.
bashrc

හරි. K = 2 සඳහා "දෙවන අනුපිළිවෙල" xor යනු කුමක් දැයි ඔබට අදහසක් තිබේද? එකතුව සඳහා චතුරස්රයන් භාවිතා කිරීමට සමානව, අපට xor සඳහා "වර්ග" කළ හැකිද?
තෝමස් අහ්

1
H තෝමස්අහෙල් එය අතුරුදහන් වූ අංක 2 ක් සඳහා වැඩ කිරීමට වෙනස් කරන ලදි.
bashrc

මෙය මගේ ප්‍රියතම ක්‍රමයයි :)
රොබට් කිං

3

ඔබට ලැයිස්තු දෙකේම එකතුව සහ ලැයිස්තු දෙකේම නිෂ්පාදනයක් තිබේ නම් ඔබට Q2 විසඳිය හැකිය.

(l1 මුල් පිටපත, l2 නවීකරණය කරන ලද ලැයිස්තුවයි)

d = sum(l1) - sum(l2)
m = mul(l1) / mul(l2)

අංක ගණිත ශ්‍රේණියේ එකතුව පළමු හා අවසාන පදවල සාමාන්‍යයට වඩා n ගුණයක් වන බැවින් අපට මෙය ප්‍රශස්තිකරණය කළ හැකිය:

n = len(l1)
d = (n/2)*(n+1) - sum(l2)

දැන් අපි දන්නවා (a සහ b ඉවත් කළ සංඛ්‍යා නම්):

a + b = d
a * b = m

එබැවින් අපට නැවත සකස් කළ හැකිය:

a = s - b
b * (s - b) = m

ගුණ කරන්න:

-b^2 + s*b = m

දකුණු පැත්ත ශුන්‍ය වන පරිදි නැවත සකස් කරන්න:

-b^2 + s*b - m = 0

එවිට අපට චතුරස්රාකාර සූත්‍රය සමඟ විසඳා ගත හැකිය:

b = (-s + sqrt(s^2 - (4*-1*-m)))/-2
a = s - b

නියැදි පයිතන් 3 කේතය:

from functools import reduce
import operator
import math
x = list(range(1,21))
sx = (len(x)/2)*(len(x)+1)
x.remove(15)
x.remove(5)
mul = lambda l: reduce(operator.mul,l)
s = sx - sum(x)
m = mul(range(1,21)) / mul(x)
b = (-s + math.sqrt(s**2 - (-4*(-m))))/-2
a = s - b
print(a,b) #15,5

වර්ග අඩි වල සංකීර්ණත්වය, කාර්යයන් අඩු කිරීම සහ සාරාංශ කිරීම මම නොදනිමි, එබැවින් මෙම විසඳුමේ සංකීර්ණතාව මට විසඳා ගත නොහැක (යමෙකු දන්නේ නම් කරුණාකර පහත අදහස් දක්වන්න.)


ගණනය කිරීම සඳහා කොපමණ කාලයක් හා මතකයක් භාවිතා x1*x2*x3*...කරයිද?
තෝමස් අහ්

H තෝමස්අහෙල් එය ලැයිස්තුවේ දිග මත ඕ (එන්)-ටයිම් සහ ඕ (1) අවකාශය වේ, නමුත් යථාර්ථයේ දී එය ගුණනය (අවම වශයෙන් පයිතන්හි) ඕ (එන් ^ 1.6) වේ. අංකය සහ සංඛ්‍යා O (log n) - ඒවායේ දිග මත අවකාශය වේ.
ටූමාස් ලාක්කොනන්

H තෝමස්අහෙල් නැත, ලොග් (a ^ n) = n * ලොග් (අ) එවිට ඔබට අංකය ගබඩා කිරීම සඳහා O (l log k) අවකාශය ඇත. එබැවින් දිග l හා මුල් දිග k ලැයිස්තුවක් ලබා දෙන විට ඔබට O (l) අවකාශය ඇති නමුත් නියත සාධකය (ලොග් k) ඒවා සියල්ලම ලිවීමට වඩා අඩු වනු ඇත. (මගේ ක්‍රමය ප්‍රශ්නයට පිළිතුරු සැපයීමේ හොඳ ක්‍රමයක් යැයි මම නොසිතමි.)
ටූමාස් ලාක්කොනන්

3

Q2 සඳහා ඉතා සරල විසඳුමක් වන අතර එය පුදුමයට කරුණකි. නැතිවූ අංක දෙකේ එකතුව සොයා ගැනීමට Q1 සිට ක්‍රමය භාවිතා කරන්න. අපි එය S මගින් දක්වමු, නැතිවූ අංක වලින් එකක් S / 2 ට වඩා කුඩා වන අතර අනෙක S / 2 (duh) ට වඩා විශාල වේ. 1 සිට S / 2 දක්වා ඇති සියලුම සංඛ්‍යා සාරාංශ කොට නැතිවූ සංඛ්‍යා අතර පහළ සොයා ගැනීමට සූත්‍රයේ ප්‍රති result ලයට (Q1 හි ක්‍රමයට සමානව) සංසන්දනය කරන්න. නැතිවූ විශාල අංකය සොයා ගැනීමට එය S වෙතින් අඩු කරන්න.


මම හිතන්නේ මෙය ස්වාලෝර්සන්ගේ පිළිතුරට සමාන ය , නමුත් ඔබ එය වඩා හොඳ වචන වලින් පැහැදිලි කළේය. එය Qk වෙත සාමාන්‍යකරණය කරන්නේ කෙසේදැයි යම් අදහසක් තිබේද?
ජෝන් මැක්ලේන්

අනෙක් පිළිතුර නැතිවීම ගැන කණගාටුයි. නැතිවූ කුඩාම මූලද්‍රව්‍යය යම් පරාසයකට බැඳ තැබිය නොහැකි බැවින් එය $ Q_k to ට සාමාන්‍යකරණය කළ හැකිදැයි මට විශ්වාස නැත. සමහර මූලද්‍රව්‍ය $ S / k than ට වඩා කුඩා විය යුතු බව ඔබ දන්නා නමුත් බහු මූලද්‍රව්‍ය සඳහා එය සත්‍ය විය හැකිය
ගිලාඩ් ඩොයිෂ්

2

කිසිදු සංකීර්ණ ගණිතමය සමීකරණ හා න්‍යායන් නොමැතිව මෙය කළ හැකි යැයි මම සිතමි. පහත දැක්වෙන්නේ ස්ථානයක සහ O (2n) කාල සංකීර්ණ විසඳුමක් සඳහා වූ යෝජනාවකි:

ආදාන ආකෘති උපකල්පන:

බෑගයේ ඇති අංක ගණන = n

අතුරුදහන් වූ අංක # = k

බෑගයේ ඇති ඉලක්කම් දිග n අරාවකින් නිරූපණය කෙරේ

ඇල්ගෝ සඳහා ආදාන අරාවේ දිග = n

අරාවෙහි නැතිවූ ඇතුළත් කිරීම් (බෑගයෙන් ඉවතට ගත් සංඛ්‍යා) අරාවෙහි පළමු මූලද්‍රව්‍යයේ අගය මගින් ප්‍රතිස්ථාපනය වේ.

උදා. මුලදී බෑගය [2,9,3,7,8,6,4,5,1,10] වගේ. 4 පිටතට ගන්නේ නම්, 4 හි අගය 2 බවට පත්වේ (අරාවේ පළමු අංගය). එම නිසා බෑගය 4 ක් ගත් පසු [2,9,3,7,8,6,2,5,1,10]

මෙම විසඳුමේ ප්‍රධාන දෙය නම්, අරාව හරහා ගමන් කරන විට, එම INDEX හි අගය නොසලකා හැරීමෙන් අමුත්තන්ගේ INDEX ටැග් කිරීමයි.

    IEnumerable<int> GetMissingNumbers(int[] arrayOfNumbers)
    {
        List<int> missingNumbers = new List<int>();
        int arrayLength = arrayOfNumbers.Length;

        //First Pass
        for (int i = 0; i < arrayLength; i++)
        {
            int index = Math.Abs(arrayOfNumbers[i]) - 1;
            if (index > -1)
            {
                arrayOfNumbers[index] = Math.Abs(arrayOfNumbers[index]) * -1; //Marking the visited indexes
            }
        }

        //Second Pass to get missing numbers
        for (int i = 0; i < arrayLength; i++)
        {                
            //If this index is unvisited, means this is a missing number
            if (arrayOfNumbers[i] > 0)
            {
                missingNumbers.Add(i + 1);
            }
        }

        return missingNumbers;
    }

මෙය ඕනෑවට වඩා මතකය භාවිතා කරයි.
තෝමස් අහ්

2

මේ ආකාරයට ප්‍රවාහ ඇල්ගොරිතම සාමාන්‍යකරණය කිරීමට පොදු ක්‍රමයක් තිබේ. kඅපගේ මුල් ඇල්ගොරිතම අපට ඇති ගැටළුව විසඳන ස්වාධීන මූල ගැටළු වලට මූලද්‍රව්‍ය 'පැතිරීම' සඳහා අහඹු ලෙස ටිකක් භාවිතා කිරීම මෙහි අදහසයි . මෙම තාක්ෂණය විරල සං signal ා ප්‍රතිනිර්මාණය සඳහා භාවිතා වේ.

නැතිවූ සියලුම සංඛ්‍යා විවිධ බාල්දි වලට සෝදා ඇත්නම්, අරාවේ ශුන්‍ය නොවන මූලද්‍රව්‍යවල දැන් නැතිවූ සංඛ්‍යා අඩංගු වේ.

විශේෂිත යුගලයක් එකම බාල්දියකට යවන සම්භාවිතාව 1/uවිශ්ව හැෂ් ශ්‍රිතයක අර්ථ දැක්වීමට වඩා අඩුය . ගැන පවතින බැවින් k^2/2යුගල, අපි දෝෂ සම්භාව්යතාවය වැඩිම බව ඇති k^2/2/u=1/2. එනම්, අපි අවම වශයෙන් 50% ක සම්භාවිතාවක් සමඟ සාර්ථක වන අතර, අපි වැඩි කළහොත් uඅපගේ අවස්ථා වැඩි වේ.

මෙම ඇල්ගොරිතමයට k^2 lognබිටු lognප්‍රමාණයක් අවශ්‍ය බව සලකන්න (අපට අරාව බාල්දියකට බිටු අවශ්‍යයි .) මෙය im ඩිමිට්‍රිස් ඇන්ඩ්‍රියෝගේ පිළිතුරට අවශ්‍ය අවකාශයට ගැලපේ (විශේෂයෙන් බහුපද සාධකකරණයේ අවකාශ අවශ්‍යතාවය අහඹු ලෙස සිදු වේ.) මෙම ඇල්ගොරිතමයට නියත වේ kබල එකතුවක වේලාවට වඩා යාවත්කාලීනයකට කාලය .

ඇත්ත වශයෙන්ම, අදහස් දැක්වීමේ විස්තර කර ඇති උපක්‍රමය භාවිතා කිරීමෙන් බල එකතුව ක්‍රමයට වඩා කාර්යක්ෂම විය හැකිය.


සටහන: අපගේ යන්ත්‍රයේ වේගවත් නම්, ඒ xorවෙනුවට අපට සෑම බාල්දියකම භාවිතා කළ හැකිය sum.
තෝමස් අහ්

සිත්ගන්නාසුළු නමුත් මම සිතන්නේ මෙය අවකාශයේ අවහිරතාවයට ගරු කරන්නේ k <= sqrt(n)- අවම වශයෙන් නම් u=k^2? K = 11 සහ n = 100 යැයි සිතමු, එවිට ඔබට බාල්දි 121 ක් ඇති අතර ඇල්ගොරිතම අවසන් වන්නේ බිට් 100 ක අරාවක් තිබීම හා සමාන වන අතර ඔබ ධාරාවෙන් එක් එක් # කියවන විට පරීක්ෂා කර බලන්න. වැඩි uකිරීම සාර්ථකත්වයේ අවස්ථා වැඩි දියුණු කරන නමුත් අවකාශයේ සීමාව ඉක්මවා යාමට පෙර ඔබට එය කොපමණ වැඩි කළ හැකිද යන්නට සීමාවක් තිබේ.
FuzzyTree

1
මම සිතනවාට nවඩා විශාල වශයෙන් ගැටළුව වඩාත් අර්ථවත් කරයි k, නමුත් k lognනියත කාල යාවත්කාලීනයන් තිබියදීත්, විස්තර කර ඇති හැෂිං වලට සමාන ක්‍රමවේදයක් සමඟ ඔබට ඇත්ත වශයෙන්ම ඉඩ ලබා ගත හැකිය . එය බල ක්‍රමයේ එකතුව මෙන් gnunet.org/eppstein-set-reconciliation හි විස්තර කර ඇත , නමුත් මූලික වශයෙන් ඔබ 'k' බාල්දි දෙකකට හෑෂ් කරන්නේ ටැබුලේෂන් හැෂිං වැනි ශක්තිමත් හැෂ් ශ්‍රිතයක් ඇති අතර සමහර බාල්දියකට ඇත්තේ එක් මූලද්‍රව්‍යයක් පමණක් බව සහතික කරයි . විකේතනය කිරීම සඳහා, ඔබ එම බාල්දිය හඳුනාගෙන එහි බාල්දි දෙකෙන්ම මූලද්‍රව්‍යය ඉවත් කරයි, එය වෙනත් බාල්දියක් නිදහස් කරයි (බොහෝ විට)
තෝමස් අහ්ලේ

2

මෙන්න sdcvvc / Dimitris Andreou ගේ පිළිතුරු මෙන් සංකීර්ණ ගණිතය මත රඳා නොපවතින විසඳුමක්, කැෆේ සහ කර්නල් භීතිකාව මෙන් ආදාන අරාව වෙනස් නොකරයි, සහ ක්‍රිස් ලර්චර්, ජෙරමිපී සහ අති විශාල ප්‍රමාණයේ බිට්සෙට් භාවිතා නොකරයි. තවත් බොහෝ අය එසේ කළහ. මූලික වශයෙන්, මම Q2 සඳහා ස්වාලෝර්සන්ගේ / ගිලාඩ් ඩියුච්ගේ අදහස සමඟ ආරම්භ කළෙමි, එය පොදු නඩුව Qk වෙත සාමාන්‍යකරණය කර ඇල්ගොරිතම ක්‍රියාත්මක වන බව ඔප්පු කිරීම සඳහා ජාවා හි ක්‍රියාත්මක කළෙමි.

අදහස

අපි අත්තනෝමතික පරතරය හිතන්න මම අප පමණක් එය අතුරුදන් සංඛ්යා වශයෙන් එක් දී ඇති බව ඔබ දන්නවාද වන. ආදාන මාලාවක් හරහා එක් සමත් පසු, පමණක් සිට අංක දෙස මම , අපි මුදලක් දෙකම ලබා ගත හැක එස් සහ ප්රමාණය Q සිට අතුරුදන් සංඛ්යා මම . අපි සරලව decrementing විසින් මේ මම ගේ අපි එකෙන් අංක මුහුණ එක් එක් කාල දිග මම (ලබා ගැනීම සඳහා Q ) සහ සියලු සංඛ්යා පෙර ගණනය මුදලක් අඩුවීම මම (ලබා ගැනීම සඳහා එක් එක් කාල බව මුහුණ සංඛ්යාව එස් ).

දැන් අපි S සහ Q දෙස බලමු . නම් ප්ර = 1 , එය එසේ නම් බවයි මම අතුරුදහන් අංක එක් අයෙකු පමණක් අඩංගු, සහ මෙම සංඛ්යාව පැහැදිලිව ම එස් . අපි නිමිත්තෙන් මම නිමි (එය මෙම වැඩසටහන "විස්තර කරනා" ලෙස ද හඳුන්වනු ලැබේ) වන අතර එය තවදුරටත් නො සලකා එය අත්හැර ලෙස. අනෙක් අතට, Q> 1 නම් , I හි අඩංගු නැතිවූ සංඛ්‍යා වල සාමාන්‍ය A = S / Q ගණනය කළ හැකිය . සියලුම සංඛ්‍යා එකිනෙකට වෙනස් බැවින් අවම වශයෙන් එවැනි සංඛ්‍යා වලින් එකක් A ට වඩා තදින් අඩු වන අතර අවම වශයෙන් එකක් A ට වඩා තදින් වැඩි වේ . දැන් අපි බෙදී මම ගැනකුඩා අන්තරයන් දෙකකට, එක් එක් අවම වශයෙන් එක් අතුරුදහන් අංකයක්වත් අඩංගු වේ. එය පූර්ණ සංඛ්‍යාවක් නම් අපි A ලබා දෙන කාල පරතරයන්ගෙන් කමක් නැත.

අපි ඒ ගැන ඊළඟ මාලාවක් සමත් ගණනය කරන්න එස් සහ Q වන පරාසය එක් එක් සඳහා, ෙවන් ෙවන් වශෙයන් (නමුත් එම සමත් තුළ) සහ සමග බව ලකුණ ප්රාන්තර පසු Q = 1 හා සමග භේදය ප්රාන්තර Q> 1 . නව "නොපැහැදිලි" අන්තරයන් නොමැති තෙක් අපි මෙම ක්‍රියාවලිය දිගටම කරගෙන යමු, එනම් අපට බෙදීමට කිසිවක් නැත, මන්ද සෑම කාල පරතරයකම හරියටම නැතිවූ අංකයක් අඩංගු වන හෙයිනි (තවද අපි සෑම විටම මෙම අංකය දන්නේ අපි එස් දන්නා නිසා ). හැකි සෑම අංකයක්ම අඩංගු එකම “සම්පූර්ණ පරාසය” පරතරයෙන් අපි ආරම්භ කරමු ( ප්‍රශ්නයේ [1..N] වැනි ).

කාලය සහ අවකාශ සංකීර්ණතා විශ්ලේෂණය

මුළු සාමාර්ථ ගණන පි අප එම ක්රියාවලිය නතර වන තුරු සිදු කිරීමට අවශ්ය අතුරුදන් අංක ගණන් වඩා වැඩි නො වේ k . P <= k හි අසමානතාවය දැඩි ලෙස ඔප්පු කළ හැකිය. අනෙක් අතට, k හි විශාල අගයන් සඳහා ප්‍රයෝජනවත් වන ආනුභවික ඉහළ මායිම් p <log 2 N + 3 ද ඇත. ආදාන අරාව අයත් එක් එක් අංකය සඳහා ද්විමය සෙවීමක් කළ යුතුය. මෙය කාල සංකීර්ණතාවයට ලොග් k ගුණකය එක් කරයි .

සමස්තයක් වශයෙන්, කාල සංකීර්ණතාව O (N ᛫ min (k, log N) ᛫ log k) වේ. විශාල k සඳහා , මෙය sdcvvc / Dimitris Andreou ගේ ක්‍රමයට වඩා සැලකිය යුතු ලෙස යහපත් වන අතර එය O (N ᛫ k) වේ.

එහි කාර්යය සඳහා, ඇල්ගොරිතමයට බොහෝ k පරතරයන්හි ගබඩා කිරීම සඳහා O (k) අමතර ඉඩක් අවශ්‍ය වන අතර එය “බිට්සෙට්” විසඳුම්වල O (N) ට වඩා සැලකිය යුතු ලෙස හොඳය .

ජාවා ක්‍රියාත්මක කිරීම

ඉහත ඇල්ගොරිතම ක්‍රියාත්මක කරන ජාවා පන්තියක් මෙන්න. එය සැමවිටම a හරිම අතුරුදහන් සංඛ්යා සාධක විය. ඒ හැරුණු විට, නැතිවූ අංක k ගණනය කිරීම අවශ්‍ය නොවේ . සංඛ්‍යා පරාසය ලබා දී ඇත්තේ minNumberසහ maxNumberපරාමිතීන් මගිනි (උදා: ප්‍රශ්නයේ පළමු උදාහරණය සඳහා 1 සහ 100).

public class MissingNumbers {
    private static class Interval {
        boolean ambiguous = true;
        final int begin;
        int quantity;
        long sum;

        Interval(int begin, int end) { // begin inclusive, end exclusive
            this.begin = begin;
            quantity = end - begin;
            sum = quantity * ((long)end - 1 + begin) / 2;
        }

        void exclude(int x) {
            quantity--;
            sum -= x;
        }
    }

    public static int[] find(int minNumber, int maxNumber, NumberBag inputBag) {
        Interval full = new Interval(minNumber, ++maxNumber);
        for (inputBag.startOver(); inputBag.hasNext();)
            full.exclude(inputBag.next());
        int missingCount = full.quantity;
        if (missingCount == 0)
            return new int[0];
        Interval[] intervals = new Interval[missingCount];
        intervals[0] = full;
        int[] dividers = new int[missingCount];
        dividers[0] = minNumber;
        int intervalCount = 1;
        while (true) {
            int oldCount = intervalCount;
            for (int i = 0; i < oldCount; i++) {
                Interval itv = intervals[i];
                if (itv.ambiguous)
                    if (itv.quantity == 1) // number inside itv uniquely identified
                        itv.ambiguous = false;
                    else
                        intervalCount++; // itv will be split into two intervals
            }
            if (oldCount == intervalCount)
                break;
            int newIndex = intervalCount - 1;
            int end = maxNumber;
            for (int oldIndex = oldCount - 1; oldIndex >= 0; oldIndex--) {
                // newIndex always >= oldIndex
                Interval itv = intervals[oldIndex];
                int begin = itv.begin;
                if (itv.ambiguous) {
                    // split interval itv
                    // use floorDiv instead of / because input numbers can be negative
                    int mean = (int)Math.floorDiv(itv.sum, itv.quantity) + 1;
                    intervals[newIndex--] = new Interval(mean, end);
                    intervals[newIndex--] = new Interval(begin, mean);
                } else
                    intervals[newIndex--] = itv;
                end = begin;
            }
            for (int i = 0; i < intervalCount; i++)
                dividers[i] = intervals[i].begin;
            for (inputBag.startOver(); inputBag.hasNext();) {
                int x = inputBag.next();
                // find the interval to which x belongs
                int i = java.util.Arrays.binarySearch(dividers, 0, intervalCount, x);
                if (i < 0)
                    i = -i - 2;
                Interval itv = intervals[i];
                if (itv.ambiguous)
                    itv.exclude(x);
            }
        }
        assert intervalCount == missingCount;
        for (int i = 0; i < intervalCount; i++)
            dividers[i] = (int)intervals[i].sum;
        return dividers;
    }
}

සාධාරණත්වය සඳහා, මෙම පන්තියට NumberBagවස්තු ස්වරූපයෙන් ආදානය ලැබේ . NumberBagඅරාව වෙනස් කිරීමට සහ අහඹු ලෙස ප්‍රවේශ වීමට ඉඩ නොදෙන අතර අනුක්‍රමික ගමන් කිරීම සඳහා අරාව කී වතාවක් ඉල්ලා ඇත්ද යන්න ගණනය කරයි. එය Iterable<Integer>ප්‍රාථමික බොක්සිං ක්‍රීඩාවෙන් වැළකී සිටිනවාට වඩා විශාල අරා පරීක්ෂණ සඳහා වඩාත් සුදුසු වේint අගයන් සහ int[]පහසු පරීක්ෂණ සකස් කිරීම සඳහා විශාල කොටසක් එතීමට ඉඩ සලසන . එය අපහසු නැත වෙනුවට, අවශ්ය නම්, ය NumberBagවිසින් int[]හෝ Iterable<Integer>වර්ගය තුළ findඅත්සන, foreach අය බවට සඳහා-වළළු එය දෙකක් වෙනස් කිරීම මගින්.

import java.util.*;

public abstract class NumberBag {
    private int passCount;

    public void startOver() {
        passCount++;
    }

    public final int getPassCount() {
        return passCount;
    }

    public abstract boolean hasNext();

    public abstract int next();

    // A lightweight version of Iterable<Integer> to avoid boxing of int
    public static NumberBag fromArray(int[] base, int fromIndex, int toIndex) {
        return new NumberBag() {
            int index = toIndex;

            public void startOver() {
                super.startOver();
                index = fromIndex;
            }

            public boolean hasNext() {
                return index < toIndex;
            }

            public int next() {
                if (index >= toIndex)
                    throw new NoSuchElementException();
                return base[index++];
            }
        };
    }

    public static NumberBag fromArray(int[] base) {
        return fromArray(base, 0, base.length);
    }

    public static NumberBag fromIterable(Iterable<Integer> base) {
        return new NumberBag() {
            Iterator<Integer> it;

            public void startOver() {
                super.startOver();
                it = base.iterator();
            }

            public boolean hasNext() {
                return it.hasNext();
            }

            public int next() {
                return it.next();
            }
        };
    }
}

පරීක්ෂණ

මෙම පංතිවල භාවිතය පෙන්නුම් කරන සරල උදාහරණ පහත දැක්වේ.

import java.util.*;

public class SimpleTest {
    public static void main(String[] args) {
        int[] input = { 7, 1, 4, 9, 6, 2 };
        NumberBag bag = NumberBag.fromArray(input);
        int[] output = MissingNumbers.find(1, 10, bag);
        System.out.format("Input: %s%nMissing numbers: %s%nPass count: %d%n",
                Arrays.toString(input), Arrays.toString(output), bag.getPassCount());

        List<Integer> inputList = new ArrayList<>();
        for (int i = 0; i < 10; i++)
            inputList.add(2 * i);
        Collections.shuffle(inputList);
        bag = NumberBag.fromIterable(inputList);
        output = MissingNumbers.find(0, 19, bag);
        System.out.format("%nInput: %s%nMissing numbers: %s%nPass count: %d%n",
                inputList, Arrays.toString(output), bag.getPassCount());

        // Sieve of Eratosthenes
        final int MAXN = 1_000;
        List<Integer> nonPrimes = new ArrayList<>();
        nonPrimes.add(1);
        int[] primes;
        int lastPrimeIndex = 0;
        while (true) {
            primes = MissingNumbers.find(1, MAXN, NumberBag.fromIterable(nonPrimes));
            int p = primes[lastPrimeIndex]; // guaranteed to be prime
            int q = p;
            for (int i = lastPrimeIndex++; i < primes.length; i++) {
                q = primes[i]; // not necessarily prime
                int pq = p * q;
                if (pq > MAXN)
                    break;
                nonPrimes.add(pq);
            }
            if (q == p)
                break;
        }
        System.out.format("%nSieve of Eratosthenes. %d primes up to %d found:%n",
                primes.length, MAXN);
        for (int i = 0; i < primes.length; i++)
            System.out.format(" %4d%s", primes[i], (i % 10) < 9 ? "" : "\n");
    }
}

විශාල අරා පරීක්ෂණ මේ ආකාරයෙන් සිදු කළ හැකිය:

import java.util.*;

public class BatchTest {
    private static final Random rand = new Random();
    public static int MIN_NUMBER = 1;
    private final int minNumber = MIN_NUMBER;
    private final int numberCount;
    private final int[] numbers;
    private int missingCount;
    public long finderTime;

    public BatchTest(int numberCount) {
        this.numberCount = numberCount;
        numbers = new int[numberCount];
        for (int i = 0; i < numberCount; i++)
            numbers[i] = minNumber + i;
    }

    private int passBound() {
        int mBound = missingCount > 0 ? missingCount : 1;
        int nBound = 34 - Integer.numberOfLeadingZeros(numberCount - 1); // ceil(log_2(numberCount)) + 2
        return Math.min(mBound, nBound);
    }

    private void error(String cause) {
        throw new RuntimeException("Error on '" + missingCount + " from " + numberCount + "' test, " + cause);
    }

    // returns the number of times the input array was traversed in this test
    public int makeTest(int missingCount) {
        this.missingCount = missingCount;
        // numbers array is reused when numberCount stays the same,
        // just Fisher–Yates shuffle it for each test
        for (int i = numberCount - 1; i > 0; i--) {
            int j = rand.nextInt(i + 1);
            if (i != j) {
                int t = numbers[i];
                numbers[i] = numbers[j];
                numbers[j] = t;
            }
        }
        final int bagSize = numberCount - missingCount;
        NumberBag inputBag = NumberBag.fromArray(numbers, 0, bagSize);
        finderTime -= System.nanoTime();
        int[] found = MissingNumbers.find(minNumber, minNumber + numberCount - 1, inputBag);
        finderTime += System.nanoTime();
        if (inputBag.getPassCount() > passBound())
            error("too many passes (" + inputBag.getPassCount() + " while only " + passBound() + " allowed)");
        if (found.length != missingCount)
            error("wrong result length");
        int j = bagSize; // "missing" part beginning in numbers
        Arrays.sort(numbers, bagSize, numberCount);
        for (int i = 0; i < missingCount; i++)
            if (found[i] != numbers[j++])
                error("wrong result array, " + i + "-th element differs");
        return inputBag.getPassCount();
    }

    public static void strideCheck(int numberCount, int minMissing, int maxMissing, int step, int repeats) {
        BatchTest t = new BatchTest(numberCount);
        System.out.println("╠═══════════════════════╬═════════════════╬═════════════════╣");
        for (int missingCount = minMissing; missingCount <= maxMissing; missingCount += step) {
            int minPass = Integer.MAX_VALUE;
            int passSum = 0;
            int maxPass = 0;
            t.finderTime = 0;
            for (int j = 1; j <= repeats; j++) {
                int pCount = t.makeTest(missingCount);
                if (pCount < minPass)
                    minPass = pCount;
                passSum += pCount;
                if (pCount > maxPass)
                    maxPass = pCount;
            }
            System.out.format("║ %9d  %9d  ║  %2d  %5.2f  %2d  ║  %11.3f    ║%n", missingCount, numberCount, minPass,
                    (double)passSum / repeats, maxPass, t.finderTime * 1e-6 / repeats);
        }
    }

    public static void main(String[] args) {
        System.out.println("╔═══════════════════════╦═════════════════╦═════════════════╗");
        System.out.println("║      Number count     ║      Passes     ║  Average time   ║");
        System.out.println("║   missimg     total   ║  min  avg   max ║ per search (ms) ║");
        long time = System.nanoTime();
        strideCheck(100, 0, 100, 1, 20_000);
        strideCheck(100_000, 2, 99_998, 1_282, 15);
        MIN_NUMBER = -2_000_000_000;
        strideCheck(300_000_000, 1, 10, 1, 1);
        time = System.nanoTime() - time;
        System.out.println("╚═══════════════════════╩═════════════════╩═════════════════╝");
        System.out.format("%nSuccess. Total time: %.2f s.%n", time * 1e-9);
    }
}

අයිඩියොන් මත ඒවා අත්හදා බලන්න


1

හරිම ලස්සන ප්‍රශ්නයක්. මම Qk සඳහා නිශ්චිත වෙනසක් භාවිතා කිරීමට යන්නෙමි. රූබි හි මෙන් බොහෝ ක්‍රමලේඛන භාෂාවන්ට ඒ සඳහා සහය ඇත:

missing = (1..100).to_a - bag

එය බොහෝ විට වඩාත්ම කාර්යක්ෂම විසඳුම නොවිය හැකි නමුත් මේ අවස්ථාවේ දී එවැනි කාර්යයකට මා මුහුණ දුන්නේ නම් එය සැබෑ ජීවිතයේ දී මම භාවිතා කරමි (දන්නා සීමාවන්, අඩු සීමාවන්). සංඛ්‍යා කුලකය ඉතා විශාල නම් මම වඩාත් කාර්යක්ෂම ඇල්ගොරිතමයක් සලකා බලමි, නමුත් එතෙක් සරල විසඳුම මට ප්‍රමාණවත් වනු ඇත.


1
මෙය ඕනෑවට වඩා ඉඩ භාවිතා කරයි.
තෝමස් අහ්

H තෝමස් අහ්: සෑම දෙවන පිළිතුරකටම ඔබ නිෂ් less ල අදහස් එකතු කරන්නේ ඇයි? එය වැඩි ඉඩක් භාවිතා කිරීම ගැන ඔබ අදහස් කරන්නේ කුමක්ද?
DarkDust

ප්‍රශ්නය වන්නේ “අපට N ට සමානුපාතිකව අමතර ඉඩක් ලබා දිය නොහැකි” බවයි. මෙම විසඳුම හරියටම එය කරයි.
තෝමස් අහ්

1

ඔබට බ්ලූම් ෆිල්ටරයක් භාවිතා කිරීමට උත්සාහ කළ හැකිය . බෑගයේ ඇති සෑම අංකයක්ම පිපෙන ලෙස ඇතුල් කරන්න, ඉන්පසු සොයා නොගත් සෑම එකක්ම වාර්තා කරන තෙක් සම්පූර්ණ 1-k කට්ටලය හරහා නැවත කරන්න. මෙය සෑම අවස්ථාවකම පිළිතුර සොයා නොගත හැකි නමුත් හොඳ විසඳුමක් විය හැකිය.


මකාදැමීමට ඉඩ සලසන ගණන් කිරීමේ බ්ලූම් ෆිල්ටරය ද ඇත. එවිට ඔබට සියලු අංක එකතු කර ප්‍රවාහයේ ඔබ දකින ඒවා මකා දැමිය හැකිය.
තෝමස් අහ්

හාහා මෙය බොහෝ විට ප්‍රායෝගික පිළිතුරු වලින් එකක් විය හැකි නමුත් එතරම් අවධානයක් නොලැබේ.
ldog

1

මම එම ප්‍රශ්නයට වෙනස් ප්‍රවේශයක් ගෙන සම්මුඛ පරීක්‍ෂකවරයා ඔහු විසඳීමට උත්සාහ කරන විශාල ගැටලුව පිළිබඳ වැඩි විස්තර සොයා බලමි. ගැටළුව සහ ඒ අවට ඇති අවශ්‍යතා මත පදනම්ව, පැහැදිලිව සැකසූ පදනම් කරගත් විසඳුම නිවැරදි දෙය විය හැකි අතර උත්පාදනය-ලැයිස්තුවක්-සහ-තෝරාගැනීමෙන් පසු ප්‍රවේශය නොලැබේ.

උදාහරණයක් ලෙස, සම්මුඛ පරීක්‍ෂකවරයා nපණිවිඩ යැවීමට යන අතර එය දැන ගැනීමට අවශ්‍ය විය හැකිය . ඊට පසු, කට්ටලය තුළ අස්ථානගත වී ඇති මූලද්‍රව්‍ය ලැයිස්තුවක් අඩංගු වන අතර අමතර සැකසුම් කිරීමක් නොමැත.k අතර පිළිතුරක් නොලැබුණු බව අවශ්‍ය විය හැකි අතර පසුව හැකි තරම් කුඩා බිත්ති ඔරලෝසු වේලාවක එය දැන සිටිය යුතුයn-k පිළිතුර . පණිවුඩ නාලිකාවේ ස්වභාවය කෙතරම්ද යත්, අවසාන පිළිතුර ලැබීමෙන් පසු අවසාන ප්‍රති result ලය ලබා ගැනීමට කොපමණ කාලයක් ගතවේද යන්නට කිසිදු බලපෑමක් නොකර පණිවුඩ අතර යම් සැකසුම් කිරීමට ප්‍රමාණවත් කාලයක් තිබේ. යවන ලද සෑම පණිවුඩයකම හඳුනාගැනීමේ අංගයක් කට්ටලයකට ඇතුළු කර අනුරූප පිළිතුර ලැබෙන විට එය මකා දැමීම සඳහා එම කාලය යෙදවිය හැකිය. අවසාන පිළිතුර පැමිණි පසු, කළ යුතු එකම දෙය වන්නේ එහි අනන්‍යතාවය කට්ටලයෙන් ඉවත් කිරීමයි.O(log k+1)k

පූර්වයෙන් ජනනය කරන ලද සංඛ්‍යා බෑග් පිරිසැකසුම් කිරීම සඳහා මෙය වේගවත්ම ප්‍රවේශය නොවේ O((log 1 + log 2 + ... + log n) + (log n + log n-1 + ... + log k)). නමුත් එය ඕනෑම වටිනාකමක් සඳහා ක්‍රියා කරයි k(එය කල්තියා නොදැන සිටියද) සහ ඉහත උදාහරණයේ දී එය වඩාත් තීරණාත්මක කාල පරතරය අවම වන අයුරින් ක්‍රියාත්මක කරන ලදී.


ඔබට O (k ^ 2) අමතර මතකයක් පමණක් තිබේ නම් මෙය ක්‍රියාත්මක වේද?
තෝමස් අහ්

1

සමමිතීන් (කණ්ඩායම්, ගණිත භාෂාවෙන්) අනුව ඒ ගැන සිතීමෙන් ඔබට විසඳුම පෙළඹවිය හැකිය. අංක කට්ටලයේ අනුපිළිවෙල කුමක් වුවත්, පිළිතුර සමාන විය යුතුය. kනැතිවූ මූලද්‍රව්‍ය තීරණය කිරීම සඳහා ඔබ කාර්යයන් භාවිතා කිරීමට යන්නේ නම් , එම දේපලෙහි ඇති කාර්යයන් මොනවාදැයි ඔබ සිතිය යුතුය: සමමිතික. ශ්‍රිතය s_1(x) = x_1 + x_2 + ... + x_nසමමිතික ශ්‍රිතයකට උදාහරණයකි, නමුත් ඉහළ මට්ටමේ තවත් අය සිටිති. විශේෂයෙන්, මූලික සමමිතික කාර්යයන් සලකා බලන්න . උපාධිය 2 හි මූලික සමමිතික ශ්‍රිතය නම් s_2(x) = x_1 x_2 + x_1 x_3 + ... + x_1 x_n + x_2 x_3 + ... + x_(n-1) x_nමූලද්‍රව්‍ය දෙකක සියලුම නිෂ්පාදනවල එකතුවයි. ඒ හා සමානව 3 සහ ඊට වැඩි උපාධිවල මූලික සමමිතික කාර්යයන් සඳහා. ඒවා පැහැදිලිවම සමමිතික ය. තවද, ඒවා සියලු සමමිතික කාර්යයන් සඳහා ගොඩනැඟිලි කොටස් බව පෙනේ.

එය සටහන් කිරීමෙන් ඔබට මූලික සමමිතික කාර්යයන් ගොඩනගා ගත හැකිය s_2(x,x_(n+1)) = s_2(x) + s_1(x)(x_(n+1)). වැඩිදුර සිතුවිලි ඔබට ඒත්තු ගැන්විය යුතු s_3(x,x_(n+1)) = s_3(x) + s_2(x)(x_(n+1))අතර එසේ ය, එබැවින් ඒවා එක වරකින් ගණනය කළ හැකිය.

අරාවෙහි නැතිවූ අයිතම මොනවාදැයි අපි කියන්නේ කෙසේද? බහුපද ගැන සිතන්න (z-x_1)(z-x_2)...(z-x_n). 0ඔබ කිසියම් අංකයක් දැමුවහොත් එය ඇගයීමට ලක් කරයි x_i. බහුපද පුළුල් කිරීම, ඔබට ලැබේ z^n-s_1(x)z^(n-1)+ ... + (-1)^n s_n. මූලික සමමිතික ශ්‍රිත මෙහි ද දර්ශනය වන අතර එය පුදුමයක් නොවේ. මන්දයත් අපි මූලයන්ට කිසියම් ප්‍රේරණයක් යෙදුවහොත් බහුපද එක හා සමාන විය යුතුය.

එබැවින් අපට බහුපද සෑදිය හැකි අතර අනෙක් අය සඳහන් කර ඇති පරිදි, කට්ටලයේ නොමැති සංඛ්‍යා මොනවාදැයි සොයා බැලීමට එය සාධක කිරීමට උත්සාහ කළ හැකිය.

අවසාන වශයෙන්, විශාල සංඛ්‍යාවක් සහිත මතකය පිරී ඉතිරී යාම ගැන අපි සැලකිලිමත් වන්නේ නම් (n වන සමමිතික බහුපද අනුපිළිවෙලට වනු ඇත 100!), අපට මෙම ගණනය කිරීම් 100 ට වඩා විශාල අගයක් ඇති mod pතැනක කළ හැකිය p. එවැනි අවස්ථාවකදී අපි බහුපද ඇගයීමට ලක් mod pකර එය නැවත ඇගයීමට ලක් කරමු කිරීමට 0ආදානය පවතිනා ගණනාවක් වන අතර, ආදාන මාලාවක් නොවේ ගණනාවක් විට එය ශූන්ය නොවන අගය අගය ලබා ගැනීම විට. කෙසේ වෙතත්, අනෙක් අය පෙන්වා දී ඇති පරිදි, බහුපදයේ අගයන් නියමිත වේලාවට ලබා ගැනීම සඳහා රඳා පවතී k, නොව N, අප බහුපදයට සාධක විය යුතුය mod p.


1

තවත් ක්‍රමයක් වන්නේ අවශේෂ ප්‍රස්තාර පෙරීම භාවිතා කිරීමයි.

අපට අංක 1 සිට 4 දක්වා ඇති අතර 3 අතුරුදහන් යැයි සිතමු. ද්විමය නිරූපණය පහත දැක්වේ,

1 = 001b, 2 = 010b, 3 = 011b, 4 = 100b

මට පහත දැක්වෙන ආකාරයට ප්‍රවාහ ප්‍රස්ථාරයක් නිර්මාණය කළ හැකිය.

                   1
             1 -------------> 1
             |                | 
      2      |     1          |
0 ---------> 1 ----------> 0  |
|                          |  |
|     1            1       |  |
0 ---------> 0 ----------> 0  |
             |                |
      1      |      1         |
1 ---------> 0 -------------> 1

ප්‍රවාහ ප්‍රස්ථාරයේ x නෝඩ් අඩංගු වන අතර x යනු බිටු ගණන බව සලකන්න. උපරිම දාර ගණන (2 * x) -2 වේ.

එබැවින් බිට් 32 ක පූර්ණ සංඛ්‍යාවක් සඳහා එය O (32) අවකාශය හෝ O (1) අවකාශය ගනී.

දැන් මම 1,2,4 සිට ආරම්භ වන සෑම අංකයකම ධාරිතාව ඉවත් කළහොත් මට ඉතිරිව ඇත්තේ ප්‍රස්ථාරයක් පමණි.

0 ----------> 1 ---------> 1

අවසාන වශයෙන් මම පහත දැක්වෙන ආකාරයට ලූපයක් ධාවනය කරමි,

 result = []
 for x in range(1,n):
     exists_path_in_residual_graph(x)
     result.append(x)

දැන් ප්‍රති result resultලය තුළ අස්ථානගත වී ඇති සංඛ්‍යා ද ඇත (ව්‍යාජ ධනාත්මක). නමුත් ඔ <= (ප්රතිඵලය ප්රමාණය) <= n ඇති විට kඅතුරුදහන් අංග.

ප්‍රති result ලය අස්ථානගත වී ඇත්දැයි සලකුණු කිරීමට මම අවසන් වරට දී ඇති ලැයිස්තුව හරහා යන්නෙමි.

එබැවින් කාල සංකීර්ණතාව O (n) වනු ඇත.

අවසාන වශයෙන්, එය කළ හැකි ගැටිති ගනිමින් බොරු ධනාත්මක සංඛ්යාව (සහ අවකාශය අවශ්යයි) අවම කිරීමට 00, 01, 11, 10ඒ වෙනුවට හුදෙක් 0හා 1.


ඔබේ ප්‍රස්ථාර සටහන මට තේරෙන්නේ නැත. නෝඩ්, දාර සහ ඉලක්කම් වලින් නියෝජනය වන්නේ කුමක්ද? සමහර දාර යොමු කර ඇති අතර අනෙක් ඒවා නොවන්නේ ඇයි?
ඩේන්

ඇත්ත වශයෙන්ම මට ඔබේ පිළිතුර කිසිසේත්ම තේරෙන්නේ නැත, ඔබට තවත් කරුණු පැහැදිලි කළ හැකිද?
ඩේන්

1

O (k) යන්නෙන් අදහස් කරන්නේ කුමක්ද යන්න පිළිබඳව ඔබට පැහැදිලි කිරීමක් අවශ්‍ය වනු ඇත.

අත්තනෝමතික k සඳහා ඉතා සුළු විසඳුමක් මෙන්න: ඔබේ සංඛ්‍යා සමූහයේ එක් එක් v සඳහා, 2 ^ v එකතුව රැස් කරන්න. අවසානයේදී, 1 සිට N දක්වා ලූප් කරන්න. බිට්වේස් ඇන්ඩෙඩ් 2 with i සමඟ ශුන්‍ය නම්, මම අතුරුදහන්. (හෝ සංඛ්‍යාත්මකව, එකතුවේ තට්ටුව 2 by i කින් බෙදන්නේ නම්. හෝ sum modulo 2^(i+1)) < 2^i.)

පහසුයි නේද? O (N) වේලාව, O (1) ආචයනය, එය අත්තනෝමතික k සඳහා සහය දක්වයි.

ඔබ සැබෑ පරිගණකයක O (N) ඉඩ අවශ්‍ය වන අතිවිශාල සංඛ්‍යා ගණනය කරනවා හැර. ඇත්ත වශයෙන්ම, මෙම විසඳුම ටිකක් දෛශිකයකට සමාන වේ.

එබැවින් ඔබට දක්ෂ විය හැකි අතර, එකතුව හා වර්ග ප්‍රමාණය සහ කැට එකතුව ... v ^ k එකතුව දක්වා ගණනය කර ප්‍රති .ලය උපුටා ගැනීම සඳහා විසිතුරු ගණිතය කරන්න. නමුත් ඒවාද විශාල සංඛ්‍යාවක් වන අතර, එම ප්‍රශ්නය අසන්නේ: අප කතා කරන්නේ කුමන වියුක්ත මෙහෙයුම් ආකෘතිය ගැනද? O (1) අවකාශයට කොපමණ ප්‍රමාණයක් ගැලපේද, ඔබට අවශ්‍ය ඕනෑම ප්‍රමාණයක සංඛ්‍යා එකතු කිරීමට කොපමණ කාලයක් ගතවේද?


හොඳ පිළිතුරක්! එක් කුඩා දෙයක්: "එකතුව මොඩියුලෝ 2 ^ i ශුන්‍ය නම්, මා අතුරුදහන්" වැරදිය. නමුත් අදහස් කරන්නේ කුමක්ද යන්න පැහැදිලි ය. මම හිතන්නේ "එකතුව මොඩියුලෝ 2 ^ (i + 1) 2 ^ i ට වඩා අඩු නම්, මම අතුරුදහන්" නිවැරදි වනු ඇත. (ඇත්ත වශයෙන්ම, බොහෝ ක්‍රමලේඛන භාෂාවල අපි මොඩියුලෝ ගණනය කිරීම වෙනුවට බිට් මාරුව භාවිතා කරනු ඇත. සමහර විට ක්‍රමලේඛන භාෂා සාමාන්‍ය ගණිත අංකනයට වඩා ටිකක් ප්‍රකාශිත වේ. :-))
jcsahnwaldt මොනිකා

1
ස්තූතියි, ඔබ සම්පූර්ණයෙන්ම හරි! ස්ථාවර, මම කම්මැලි සහ ගණිතමය අංකනයෙන් ray ත් වූවත් ... අනේ, මමත් එය අවුල් කළා. නැවත සවි කිරීම ...
sfink

0

අත්තනෝමතික ලෙස විශාල සංඛ්‍යා සඳහා ඔබට සහ කාර්යයන් ඇති බැවින්, මට O(k)කාලය සහ O(log(k))අවකාශ ඇල්ගොරිතම ඇති බව මම විශ්වාස කරමි :floor(x)log2(x)

ඔබ එකතු කරන තැනට k-bit දිගු පූර්ණ සංඛ්‍යාවක් ඇත (එබැවින් log8(k)අවකාශය) x^2, x යනු ඔබ බෑගයේ සොයා ගන්නා ඊළඟ අංකය වේ: s=1^2+2^2+...මේ සඳහා O(N)කාලය ගතවේ (සම්මුඛ පරීක්ෂකවරයාට එය ගැටළුවක් නොවේ). අවසානයේ ඔබට ලැබෙන්නේ j=floor(log2(s))ඔබ සොයන විශාලතම අංකයයි. ඉන්පසු s=s-jඔබ නැවත ඉහත දේ කරන්න:

for (i = 0 ; i < k ; i++)
{
  j = floor(log2(s));
  missing[i] = j;
  s -= j;
}

දැන්, ඔබට සාමාන්‍යයෙන් බිට් 2756නිඛිල සඳහා බිම් හා ලොග් 2 කාර්යයන් නොමැත, ඒ වෙනුවට යුගල සඳහා. නිසා? සරලවම, එක් එක් බයිට් 2 සඳහා (හෝ 1, හෝ 3, හෝ 4) ඔබට අපේක්ෂිත සංඛ්‍යා ලබා ගැනීම සඳහා මෙම කාර්යයන් භාවිතා කළ හැකිය, නමුත් මෙය O(N)කාල සංකීර්ණතාවයට සාධකයක් එක් කරයි


0

මෙය මෝඩකමක් ලෙස පෙනෙන්නට පුළුවන, නමුත්, ඔබ වෙත ඉදිරිපත් කරන ලද පළමු ගැටලුවේදී, එම සමීකරණය භාවිතා කර නැතිවූ අංකය සොයා ගැනීම සඳහා ඒවා එකතු කිරීම සඳහා බෑගයේ ඉතිරිව ඇති සියලුම සංඛ්‍යා දැකීමට ඔබට සිදුවේ.

එබැවින්, ඔබට සියලු සංඛ්‍යා දැක ගත හැකි බැවින්, නැතිවූ අංකය සොයා බලන්න. අංක දෙකක් අතුරුදහන් වූ විටත් එය එසේම වේ. මම හිතන්නේ හරිම සරලයි. බෑගයේ ඉතිරිව ඇති සංඛ්‍යා බැලීමට ඔබට සමීකරණයක් භාවිතා කිරීමේ තේරුමක් නැත.


2
මම හිතන්නේ ඒවා සාරාංශ කිරීමේ වාසිය නම් ඔබ දැනටමත් දැක ඇති අංක මතක තබා ගත යුතු නැති බවයි (උදා: අමතර මතක අවශ්‍යතාවයක් නොමැත). එසේ නොමැතිනම් එකම විකල්පය වන්නේ දැකිය හැකි සියලු අගයන් සමූහයක් රඳවා තබාගෙන නැතිවූ දේ සොයා ගැනීම සඳහා නැවත එම කට්ටලය හරහා නැවත යෙදීමයි.
ඩෑන් ටාවෝ

3
මෙම ප්‍රශ්නය සාමාන්‍යයෙන් අසනු ලබන්නේ O (1) අභ්‍යවකාශ සංකීර්ණතාවයේ නියමයෙනි.

පළමු N සංඛ්‍යා වල එකතුව N (N + 1) / 2 වේ. N = 100 සඳහා, එකතුව = 100 * (101) / 2 = 5050;
tmarthal

0

මම හිතන්නේ මෙය මේ ආකාරයට සාමාන්‍යකරණය කළ හැකිය:

අංක ගණිත ශ්‍රේණියේ හා ගුණ කිරීමේ ආරම්භක අගයන් ලෙස S, M දක්වන්න.

S = 1 + 2 + 3 + 4 + ... n=(n+1)*n/2
M = 1 * 2 * 3 * 4 * .... * n 

මෙය ගණනය කිරීම සඳහා සූත්‍රයක් ගැන මා සිතිය යුතුය, නමුත් එය එසේ නොවේ. කෙසේ වෙතත්, එක් අංකයක් අස්ථානගත වී ඇත්නම්, ඔබ දැනටමත් විසඳුම ලබා දී ඇත. කෙසේ වෙතත්, එවිට සංඛ්‍යා දෙකක් අස්ථානගත වී ඇත්නම්, නව එකතුව සහ S1 සහ M1 මගින් ගුණ කළ යුතු ය, එය පහත පරිදි වේ:

S1 = S - (a + b)....................(1)

Where a and b are the missing numbers.

M1 = M - (a * b)....................(2)

ඔබ S1, M1, M සහ S දන්නා බැවින්, ඉහත සමීකරණය a සහ b, නැතිවූ සංඛ්‍යා සොයා ගැනීමට විසඳිය හැකිය.

දැන් නැතිවූ අංක තුන සඳහා:

S2 = S - ( a + b + c)....................(1)

Where a and b are the missing numbers.

M2 = M - (a * b * c)....................(2)

දැන් ඔබගේ නොදන්නා දේ 3 වන අතර ඔබට විසඳිය හැකි සමීකරණ දෙකක් තිබේ.


ගුණ කිරීම තරමක් විශාල වුවද .. එසේම, අතුරුදහන් වූ සංඛ්‍යා 2 කට වඩා සාමාන්‍යකරණය කරන්නේ කෙසේද?
තෝමස් අහ්

මම මෙම සූත්‍ර N = 3 සමඟ ඉතා සරල අනුක්‍රමයක් මත අත්හදා බැලුවෙමි. නැතිවූ අංක = {1, 2}. (2) කියවිය යුතු සූත්‍රවල දෝෂය ඇති බව මා විශ්වාස කරන පරිදි මම වැඩ කළේ නැත M1 = M / (a * b)( එම පිළිතුර බලන්න ). එවිට එය හොඳින් ක්රියා කරයි.
dma_k

0

මෙය කාර්යක්ෂමද නැද්ද යන්න මම නොදනිමි නමුත් මෙම විසඳුම යෝජනා කිරීමට කැමැත්තෙමි.

  1. මූලද්‍රව්‍ය 100 න් xor ගණනය කරන්න
  2. මූලද්රව්ය 98 න් xor ගණනය කරන්න (මූලද්රව්ය 2 ඉවත් කිරීමෙන් පසුව)
  3. දැන් (1 හි ප්‍රති result ලය) XOR (2 හි ප්‍රති result ලය) මඟින් අතුරුදහන් වූ අංක දෙකේ xor ලබා දෙයි i..ea XOR b a සහ b අස්ථානගත වූ මූලද්‍රව්‍ය නම්
    4. නැතිවූ අංකවල එකතුව ඔබේ සුපුරුදු ප්‍රවේශය සමඟ ලබා ගන්න. එකතුව සූත්‍රය වෙනස් වන අතර වෙනස d යැයි කියමු.

[1, 100] හි ඇති යුගල (p, q) ලබා ගැනීමට දැන් ලූපයක් ධාවනය කරන්න.

යුගලයක් ලබා ගත් විට (3 හි ප්‍රති result ලය) XOR p = q සහ ඔව් නම් අප විසින් සිදු කර ඇත්දැයි පරීක්ෂා කරන්න.

මා වැරදියි නම් කරුණාකර මාව නිවැරදි කරන්න, මෙය නිවැරදි නම් කාල සංකීර්ණතාව පිළිබඳව අදහස් දක්වන්න


2
එකතුව සහ xor අද්විතීය ලෙස සංඛ්‍යා දෙකක් අර්ථ දක්වනු ඇතැයි මම නොසිතමි. D ට සමාන විය හැකි k-tuples ලබා ගැනීම සඳහා ලූපයක් ධාවනය කිරීම සඳහා O (C (n, k-1)) = O (n <sup> k-1 </sup>) ගත වේ, එය k> 2 සඳහා, නරකයි.
Teepeemm

0

අපට බොහෝ විට O (log n) හි Q1 සහ Q2 කළ හැකිය .

අපගේ සිතන්න memory chipපෙළගැස්මකින් සමන්විත nසංඛ්යාව test tubes. xපරීක්ෂණ නලයේ අංකයක් x milliliterරසායනික ද්‍රවයෙන් නිරූපණය කෙරේ .

අපගේ සකසනය a laser light. අපි ලේසර් දැල්වූ විට එය සියළුම නලවල දිගට ලම්බකව ගමන් කරයි. රසායනික ද්‍රවයක් හරහා ගමන් කරන සෑම අවස්ථාවකම දීප්තිය අඩු 1වේ. යම් මිලි ලීටරයක ආලෝකය ගමන් කිරීම මෙහෙයුමකි O(1).

දැන් අපි අපගේ ලේසරය පරීක්ෂණ නළය මැදින් ආලෝකමත් කර දීප්තියේ ප්‍රතිදානය ලබා ගන්නේ නම්

  • කලින් ගණනය කළ අගයකට සමාන වේ (සංඛ්‍යා නොමැති විට ගණනය කරනු ලැබේ), නැතිවූ සංඛ්‍යා ඊට වඩා වැඩිය n/2.
  • අපගේ ප්‍රතිදානය කුඩා නම්, අවම වශයෙන් එක් අතුරුදහන් සංඛ්‍යාවක් වත් කුඩා වේ n/2. කරගනුයේ අඩු වෙයි නම්, අපි පරීක්ෂා කිරීමද කළ හැක 1හෝ 2. එය අඩු වුවහොත් 1එක් අතුරුදහන් වූ සංඛ්‍යාවක් වඩා කුඩා වන n/2අතර අනෙක වඩා විශාල වේ n/2. එය අඩු වුවහොත් 2සංඛ්‍යා දෙකම වඩා කුඩා වේ n/2.

අපගේ ගැටළු වසම පටු කරමින් අපට ඉහත ක්‍රියාවලිය නැවත නැවතත් කළ හැකිය. සෑම පියවරකදීම, අපි වසම අඩකින් කුඩා කරමු. අවසාන වශයෙන් අපට අපගේ ප්‍රති .ලය ලබා ගත හැකිය.

සඳහන් කිරීමට වටින සමාන්තර ඇල්ගොරිතම (ඒවා සිත්ගන්නාසුලු නිසා),

  • සමහර සමාන්තර ඇල්ගොරිතම අනුව වර්ග කිරීම, උදාහරණයක් ලෙස සමාන්තර ඒකාබද්ධ කිරීම O(log^3 n)කාලයාගේ ඇවෑමෙන් කළ හැකිය . එවිට නැතිවූ අංකය නියමිත O(log n)වේලාවට ද්විමය සෙවීමෙන් සොයාගත හැකිය .
  • න්‍යායාත්මකව, අපට nප්‍රොසෙසර තිබේ නම්, එක් එක් ක්‍රියාවලියට එක් යෙදවුම් පරික්ෂා කර අංකය හඳුනාගත හැකි ධජයක් සැකසිය හැකිය (පහසුවෙන් අරාවෙහි). ඊළඟ පියවරේදී සෑම ක්‍රියාවලියකටම එක් එක් ධජය පරීක්ෂා කර අවසානයේ සලකුණු නොකළ අංකය ප්‍රතිදානය කළ හැකිය. සමස්ත ක්‍රියාවලිය සඳහා O(1)කාලය ගතවනු ඇත. එයට අමතර O(n)ඉඩ / මතක අවශ්‍යතාවයක් ඇත.

ඉහත සපයා ඇති සමාන්තර ඇල්ගොරිතම දෙකට අදහස් දැක්වීමේදී අමතර ඉඩක් අවශ්‍ය විය හැකි බව සලකන්න .


ටෙස්ට්-ටියුබ්-ලේසර් ක්‍රමය ඇත්තෙන්ම සිත්ගන්නා සුළු වුවත්, එය දෘඩාංග උපදෙස් වලට හොඳින් පරිවර්ථනය නොවන O(logn)බවත් පරිගණකයක සිටීමට අපහසු බවත් ඔබ එකඟ වනු ඇතැයි මම බලාපොරොත්තු වෙමි .
සර්ගුයි

1
ඔබේ වර්ග කිරීමේ ක්‍රමය සම්බන්ධයෙන් ගත් කල, එය රඳා පවතින්නේ අමතර ඉඩ ප්‍රමාණයක් Nසහ O(N)කාලයට වඩා වැඩි කාලයක් (එය මත යැපීම අනුව N), අප වඩා හොඳ කිරීමට අදහස් කරන කාලයයි .
සර්ගුයි

IrSirGuy ටෙස්ට් ටියුබ් සංකල්පය සහ සමාන්තර සැකසුම් මතක පිරිවැය පිළිබඳ ඔබගේ සැලකිල්ල මම අගය කරමි. මගේ සටහන වන්නේ ගැටලුව පිළිබඳ මගේ අදහස් බෙදා ගැනීමයි. GPU ප්‍රොසෙසර දැන් සමාන්තර සැකසුම් සිදු කරයි. කවුද දන්නේ, පරීක්ෂණ නල සංකල්පය අනාගතයේදී ලබා ගත නොහැකි නම්.
ෂුවා
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.