මෙම පිළිතුරෙහි, කොටස් දෙකක් වනු ඇත: අද්විතීය විසඳුම් දෙකක් සහ නිශ්චිත විසඳුම් සඳහා වේගයේ ප්රස්ථාරයක්.
අනුපිටපත් අයිතම ඉවත් කිරීම
මෙම පිළිතුරු බොහොමයක් ඉවත් කළ හැකි අනුපිටපත් අයිතම පමණක් ඉවත් කරයි , නමුත් මෙම ප්රශ්නයට ඇඟවෙන්නේ එය හැෂ් කළ හැකි අයිතම පමණක් අවශ්ය නොවන බවයි, එයින් අදහස් කරන්නේ මම හැෂ් කළ නොහැකි විසඳුම් කිහිපයක් ඉදිරිපත් කරමි .
collection.Counter යනු සම්මත පුස්තකාලයේ ප්රබල මෙවලමක් වන අතර මේ සඳහා පරිපූර්ණ විය හැකිය. එහි ඇත්තේ කවුන්ටරයක් ඇති තවත් එක් විසඳුමක් පමණි. කෙසේ වෙතත්, එම විසඳුම හැෂ් කළ හැකි යතුරු වලට පමණක් සීමා වේ .
කවුන්ටරයේ වෙනස් කළ නොහැකි යතුරු වලට ඉඩ දීම සඳහා, මම බහාලුම් පන්තියක් සෑදුවෙමි, එය වස්තුවේ පෙරනිමි හැෂ් ශ්රිතය ලබා ගැනීමට උත්සාහ කරනු ඇත, නමුත් එය අසමත් වුවහොත් එය එහි අනන්යතා ක්රියාකාරිත්වය උත්සාහ කරනු ඇත. එය eq සහ hash ක්රමයක් ද අර්ථ දක්වයි . අපගේ විසඳුමෙහි වෙනස් කළ නොහැකි අයිතමවලට ඉඩ දීමට මෙය ප්රමාණවත් විය යුතුය . වෙනස් කළ නොහැකි වස්තූන් ඒවා සේදිය හැකි ලෙස සලකනු ලැබේ. කෙසේ වෙතත්, මෙම හැෂ් ශ්රිතය වෙනස් කළ නොහැකි වස්තූන් සඳහා අනන්යතාවය භාවිතා කරයි, එයින් අදහස් කරන්නේ වෙනස් කළ නොහැකි සමාන වස්තු දෙකක් ක්රියා නොකරන බවයි. මම ඔබට යෝජනා කරන්නේ මෙය ඉක්මවා ගොස් සමාන විකෘති වර්ගයක හැෂ් භාවිතා කිරීම සඳහා එය වෙනස් කිරීම ( ලැයිස්තුවක් hash(tuple(my_list))
නම් භාවිතා කිරීම වැනි my_list
).
මමත් විසඳුම් දෙකක් කළා. ඕඩර්ඩෙක්ට් සහ කවුන්ටරය යන දෙකෙහිම උප පංතියක් භාවිතා කරමින් අයිතමවල අනුපිළිවෙල පවත්වා ගෙන යන තවත් විසඳුමක් වන එය 'ඕඩර්කවුන්ටර්' ලෙස නම් කර ඇත. දැන්, කාර්යයන් මෙන්න:
from collections import OrderedDict, Counter
class Container:
def __init__(self, obj):
self.obj = obj
def __eq__(self, obj):
return self.obj == obj
def __hash__(self):
try:
return hash(self.obj)
except:
return id(self.obj)
class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
def remd(sequence):
cnt = Counter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
def oremd(sequence):
cnt = OrderedCounter()
for x in sequence:
cnt[Container(x)] += 1
return [item.obj for item in cnt]
remd යනු ඇණවුම් නොකළ වර්ග කිරීමකි, oremd වර්ග කිරීම ඇණවුම් කර ඇත. කුමන එකක් වේගවත් දැයි ඔබට පැහැදිලිව පැවසිය හැකිය, නමුත් මම කෙසේ හෝ පැහැදිලි කරමි. ඇණවුම් නොකළ වර්ග කිරීම තරමක් වේගවත් වේ. ඇණවුමක් අවශ්ය නොවන බැවින් එය අඩු දත්ත ප්රමාණයක් තබා ගනී.
දැන්, මටත් අවශ්ය වූයේ එක් එක් පිළිතුරේ වේග සැසඳීම් පෙන්වීමට ය. ඉතින්, මම දැන් ඒක කරන්නම්.
වේගවත්ම කාර්යය කුමක්ද?
අනුපිටපත් ඉවත් කිරීම සඳහා, මම පිළිතුරු කිහිපයකින් කාර්යයන් 10 ක් රැස් කළෙමි. මම එක් එක් ශ්රිතයේ වේගය ගණනය කර matplotlib.pyplot භාවිතා කර ප්රස්ථාරයකට දැමුවෙමි .
මම මෙය ග්රැෆිං වට තුනකට බෙදුවෙමි. හැෂබල් යනු හෑෂ් කළ හැකි ඕනෑම වස්තුවකි, නිරුපද්රිතව යනු හැෂ් කළ නොහැකි ඕනෑම වස්තුවකි. ඇණවුම් කරන ලද අනුක්රමයක් යනු අනුපිළිවෙල ආරක්ෂා කරන අනුක්රමයකි, අනුපිළිවෙලක් නැති අනුක්රමයක් අනුපිළිවෙල ආරක්ෂා නොකරයි. දැන්, තවත් කොන්දේසි කිහිපයක් මෙන්න:
ඇණවුම් නොකළ හැෂබල් යනු අනුපිටපත් ඉවත් කරන ඕනෑම ක්රමයක් සඳහා වන අතර එය අනිවාර්යයෙන්ම ඇණවුම තබා ගත යුතු නැත. එයට වෙනස් කළ නොහැකි දේ සඳහා වැඩ කිරීමට අවශ්ය නොවීය, නමුත් එයට හැකි විය.
හැෂබල් ඇණවුම් කළා යනු ලැයිස්තුවේ ඇති අයිතමවල අනුපිළිවෙල තබා ඇති ඕනෑම ක්රමයක් සඳහා වන නමුත් එයට වෙනස් කළ නොහැකි දේ සඳහා වැඩ කිරීමට අවශ්ය නොවීය, නමුත් එයට හැකි විය.
වෙනස් කළ නොහැකි ලෙස ඇණවුම් කර ඇත යනු ලැයිස්තුවේ ඇති අයිතමවල අනුපිළිවෙල තබා ගත හැකි හා වෙනස් කළ නොහැකි දේ සඳහා වැඩ කරන ඕනෑම ක්රමයකි.
Y- අක්ෂය මත ගත වූ තත්පර ගණන වේ.
X- අක්ෂය මත ශ්රිතය යොදන අංකය වේ.
අපි ඇණවුම් නොකළ හැෂබල් සඳහා අනුක්රමයන් ජනනය කළ අතර පහත දැක්වෙන අවබෝධය ඇතිව ඇණවුම් කළ හැෂබල්: [list(range(x)) + list(range(x)) for x in range(0, 1000, 10)]
ඇණවුම් කළ නොහැකි දේ සඳහා: [[list(range(y)) + list(range(y)) for y in range(x)] for x in range(0, 1000, 10)]
පරාසය තුළ 'පියවරක්' ඇති බව සලකන්න, එය නොමැතිව මෙය 10x කාලයක් ගතවනු ඇත. මගේ පෞද්ගලික මතය අනුව, එය කියවීමට ටිකක් පහසු යැයි මම සිතුවෙමි.
පුරාවෘත්තයේ යතුරු මම ශ්රිතයේ වඩාත්ම වැදගත් කොටස් ලෙස අනුමාන කිරීමට උත්සාහ කළ දේ ද සටහන් කරන්න. නරකම හෝ හොඳම දේ කරන්නේ කුමන කාර්යය සඳහාද? ප්රස්ථාරය තමාටම කථා කරයි.
එය සමථයකට පත් කිරීමත් සමඟ, මෙන්න ප්රස්ථාර.
අනුපිළිවෙලට නැති හැෂබල්ස්
(විශාලනය කර ඇත)
ඇණවුම් කළ හැෂබල්ස්
(විශාලනය කර ඇත)
නොකැඩූ ලෙස ඇණවුම් කර ඇත
(විශාලනය කර ඇත)