Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
³£ÓòéÕÒÊý¾Ý½á¹¹¼°Ëã·¨£¨PythonʵÏÖ£©
 
  2988  次浏览      28
 2017-12-18  
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚÁõ½­µÄ²©¿Í,Ö÷Òª½²Á˳£ÓòéÕÒÊý¾Ý½á¹¹¼°Ëã·¨,°üÀ¨ÎÞÐò±í²éÕÒ¡¢ÓÐÐò±í²éÕÒ¡¢ÏßÐÔË÷Òý²éÕÒ¡¢¶þ²æÅÅÐòÊ÷¡¢Æ½ºâ¶þ²æÊ÷¡¢¶à·²éÕÒÊ÷£¨BÊ÷£©¡¢É¢ÁÐ±í£¨¹þÏ£±í£©¡£

Ò»¡¢»ù±¾¸ÅÄî

²éÕÒ£¨Searching£©¾ÍÊǸù¾Ý¸ø¶¨µÄij¸öÖµ£¬ÔÚ²éÕÒ±íÖÐÈ·¶¨Ò»¸öÆä¹Ø¼ü×ÖµÈÓÚ¸ø¶¨ÖµµÄÊý¾ÝÔªËØ£¨»ò¼Ç¼£©¡£

²éÕÒ±í£¨Search Table£©£ºÓÉͬһÀàÐ͵ÄÊý¾ÝÔªËØ£¨»ò¼Ç¼£©¹¹³ÉµÄ¼¯ºÏ

¹Ø¼ü×Ö£¨Key£©£ºÊý¾ÝÔªËØÖÐij¸öÊý¾ÝÏîµÄÖµ£¬ÓÖ³ÆÎª¼üÖµ¡£

Ö÷¼ü£¨Primary Key£©£º¿ÉΨһµØ±êʶij¸öÊý¾ÝÔªËØ»ò¼Ç¼µÄ¹Ø¼ü×Ö¡£

²éÕÒ±í°´ÕÕ²Ù×÷·½Ê½¿É·ÖΪ£º

  • ¾²Ì¬²éÕÒ±í£¨Static Search Table£©£ºÖ»×ö²éÕÒ²Ù×÷µÄ²éÕÒ±í¡£ËüµÄÖ÷Òª²Ù×÷ÊÇ£º
  • ²éѯij¸ö¡°Ìض¨µÄ¡±Êý¾ÝÔªËØÊÇ·ñÔÚ±íÖÐ
  • ¼ìË÷ij¸ö¡°Ìض¨µÄ¡±Êý¾ÝÔªËØºÍ¸÷ÖÖÊôÐÔ
  • ¶¯Ì¬²éÕÒ±í£¨Dynamic Search Table£©£ºÔÚ²éÕÒÖÐͬʱ½øÐвåÈë»òɾ³ýµÈ²Ù×÷£º
  • ²éÕÒʱ²åÈëÊý¾Ý
  • ²éÕÒʱɾ³ýÊý¾Ý

¶þ¡¢ÎÞÐò±í²éÕÒ

Ò²¾ÍÊÇÊý¾Ý²»ÅÅÐòµÄÏßÐÔ²éÕÒ£¬±éÀúÊý¾ÝÔªËØ¡£

Ëã·¨·ÖÎö£º×îºÃÇé¿öÊÇÔÚµÚÒ»¸öλÖþÍÕÒµ½ÁË£¬´ËΪO(1)£»×Çé¿öÔÚ×îºóÒ»¸öλÖòÅÕÒµ½£¬´ËΪO(n)£»ËùÒÔÆ½¾ù²éÕÒ´ÎÊýΪ(n+1)/2¡£×îÖÕʱ¼ä¸´ÔÓ¶ÈΪO(n)

# ×î»ù´¡µÄ±éÀúÎÞÐòÁбíµÄ²éÕÒËã·¨
# ʱ¼ä¸´ÔÓ¶ÈO(n)
def sequential_search(lis, key):
length = len(lis)
for i in range(length):
if lis[i] == key:
return i
else:
return False

if __name__ == '__main__':
LIST = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
result = sequential_search(LIST, 123)
print(result)

Èý¡¢ÓÐÐò±í²éÕÒ

²éÕÒ±íÖеÄÊý¾Ý±ØÐ밴ij¸öÖ÷¼ü½øÐÐijÖÖÅÅÐò£¡

Ëã·¨ºËÐÄ£ºÔÚ²éÕÒ±íÖв»¶ÏÈ¡ÖмäÔªËØÓë²éÕÒÖµ½øÐбȽϣ¬ÒÔ¶þ·ÖÖ®Ò»µÄ±¶ÂʽøÐÐ±í·¶Î§µÄËõС¡£

# Õë¶ÔÓÐÐò²éÕÒ±íµÄ¶þ·Ö²éÕÒËã·¨
# ʱ¼ä¸´ÔÓ¶ÈO(log(n))
def binary_search(lis, key):
low = 0
high = len(lis) - 1
time = 0
while low < high:
time += 1
mid = int((low + high) / 2)
if key < lis[mid]:
high = mid - 1
elif key > lis[mid]:
low = mid + 1
else:
# ´òÓ¡ÕÛ°ëµÄ´ÎÊý
print("times: %s" % time)
return mid
print("times: %s" % time)
return False
if __name__ == '__main__':
LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]
result = binary_search(LIST, 99)
print(result)

2. ²åÖµ²éÕÒ

¶þ·Ö²éÕÒ·¨ËäÈ»ÒѾ­ºÜ²»´íÁË£¬µ«»¹ÓпÉÒÔÓÅ»¯µÄµØ·½¡£

ÓеÄʱºò£¬¶Ô°ë¹ýÂË»¹²»¹»ºÝ£¬ÒªÊÇÿ´Î¶¼ÅųýÊ®·ÖÖ®¾ÅµÄÊý¾ÝÆñ²»ÊǸüºÃ£¿Ñ¡ÔñÕâ¸öÖµ¾ÍÊǹؼüÎÊÌ⣬²åÖµµÄÒâÒå¾ÍÊÇ£ºÒÔ¸ü¿ìµÄËٶȽøÐÐËõ¼õ¡£

²åÖµµÄºËÐľÍÊÇʹÓù«Ê½£º

value = (key - list[low])/(list[high] - list[low])

ÓÃÕâ¸övalueÀ´´úÌæ¶þ·Ö²éÕÒÖеÄ1/2¡£

ÉÏÃæµÄ´úÂë¿ÉÒÔÖ±½ÓʹÓã¬Ö»ÐèÒª¸ÄÒ»¾ä¡£

# ²åÖµ²éÕÒËã·¨
# ʱ¼ä¸´ÔÓ¶ÈO(log(n))
def binary_search(lis, key):
low = 0
high = len(lis) - 1
time = 0
while low < high:
time += 1
# ¼ÆËãmidÖµÊDzåÖµËã·¨µÄºËÐÄ´úÂë
mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low]))
print("mid=%s, low=%s, high=%s" % (mid, low, high))
if key < lis[mid]:
high = mid - 1
elif key > lis[mid]:
low = mid + 1
else:
# ´òÓ¡²éÕҵĴÎÊý
print("times: %s" % time)
return mid
print("times: %s" % time)
return False
if __name__ == '__main__':
LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]
result = binary_search(LIST, 444)
print(result)

²åÖµËã·¨µÄ×ÜÌåʱ¼ä¸´ÔÓ¶ÈÈÔÈ»ÊôÓÚO(log(n))¼¶±ðµÄ¡£ÆäÓŵãÊÇ£¬¶ÔÓÚ±íÄÚÊý¾ÝÁ¿½Ï´ó£¬Çҹؼü×Ö·Ö²¼±È½Ï¾ùÔȵIJéÕÒ±í£¬Ê¹ÓòåÖµËã·¨µÄƽ¾ùÐÔÄܱȶþ·Ö²éÕÒÒªºÃµÃ¶à¡£·´Ö®£¬¶ÔÓÚ·Ö²¼¼«¶Ë²»¾ùÔȵÄÊý¾Ý£¬Ôò²»ÊʺÏʹÓòåÖµËã·¨¡£

3. ì³²¨ÄÇÆõ²éÕÒ

ÓɲåÖµËã·¨´øÀ´µÄÆô·¢£¬·¢Ã÷ÁËì³²¨ÄÇÆõËã·¨¡£ÆäºËÐÄÒ²ÊÇÈçºÎÓÅ»¯ÄǸöËõ¼õËÙÂÊ£¬Ê¹µÃ²éÕÒ´ÎÊý¾¡Á¿½µµÍ¡£

ʹÓÃÕâÖÖËã·¨£¬Ç°ÌáÊÇÒѾ­ÓÐÒ»¸ö°üº¬ì³²¨ÄÇÆõÊý¾ÝµÄÁбí

F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...]

# ì³²¨ÄÇÆõ²éÕÒËã·¨
# ʱ¼ä¸´ÔÓ¶ÈO(log(n))
def fibonacci_search(lis, key):
# ÐèÒªÒ»¸öÏֳɵÄì³²¨ÄÇÆõÁÐ±í¡£Æä×î´óÔªËØµÄÖµ±ØÐ볬¹ý²éÕÒ±íÖÐÔªËØ¸öÊýµÄÊýÖµ¡£
F = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,
233, 377, 610, 987, 1597, 2584, 4181, 6765,
10946, 17711, 28657, 46368]
low = 0
high = len(lis) - 1

# ΪÁËʹµÃ²éÕÒ±íÂú×ãì³²¨ÄÇÆõÌØÐÔ£¬ÔÚ±íµÄ×îºóÌí¼Ó¼¸¸öͬÑùµÄÖµ
# Õâ¸öÖµÊÇÔ­²éÕÒ±íµÄ×îºóÄǸöÔªËØµÄÖµ
# Ìí¼ÓµÄ¸öÊýÓÉF[k]-1-high¾ö¶¨
k = 0
while high > F[k]-1:
k += 1
print(k)
i = high
while F[k]-1 > i:
lis.append(lis[high])
i += 1
print(lis)

# Ëã·¨Ö÷Âß¼­¡£timeÓÃÓÚչʾѭ»·µÄ´ÎÊý¡£
time = 0
while low <= high:
time += 1
# ΪÁË·ÀÖ¹FÁбíϱêÒç³ö£¬ÉèÖÃifºÍelse
if k < 2:
mid = low
else:
mid = low + F[k-1]-1

print("low=%s, mid=%s, high=%s" % (low, mid, high))
if key < lis[mid]:
high = mid - 1
k -= 1
elif key > lis[mid]:
low = mid + 1
k -= 2
else:
if mid <= high:
# ´òÓ¡²éÕҵĴÎÊý
print("times: %s" % time)
return mid
else:
print("times: %s" % time)
return high
print("times: %s" % time)
return False
if __name__ == '__main__':
LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444]
result = fibonacci_search(LIST, 444)
print(result)

Ëã·¨·ÖÎö£ºì³²¨ÄÇÆõ²éÕÒµÄÕûÌåʱ¼ä¸´ÔÓ¶ÈҲΪO(log(n))¡£µ«¾Íƽ¾ùÐÔÄÜ£¬ÒªÓÅÓÚ¶þ·Ö²éÕÒ¡£µ«ÊÇÔÚ×Çé¿öÏ£¬±ÈÈçÕâÀïÈç¹ûkeyΪ1£¬ÔòʼÖÕ´¦ÓÚ×ó²à°ëÇø²éÕÒ£¬´ËʱÆäЧÂÊÒªµÍÓÚ¶þ·Ö²éÕÒ¡£

×ܽ᣺¶þ·Ö²éÕÒµÄmidÔËËãÊǼӷ¨Óë³ý·¨£¬²åÖµ²éÕÒÔòÊǸ´ÔÓµÄËÄÔòÔËË㣬¶øì³²¨ÄÇÆõ²éÕÒÖ»ÊÇ×î¼òµ¥µÄ¼Ó¼õÔËËã¡£ÔÚº£Á¿Êý¾ÝµÄ²éÕÒÖУ¬ÕâÖÖϸ΢µÄ²î±ð¿ÉÄÜ»áÓ°Ïì×îÖյIJéÕÒЧÂÊ¡£Òò´Ë£¬ÈýÖÖÓÐÐò±íµÄ²éÕÒ·½·¨±¾ÖÊÉÏÊÇ·Ö¸îµãµÄÑ¡Ôñ²»Í¬£¬¸÷ÓÐÓÅÁÓ£¬Ó¦¸ù¾Ýʵ¼ÊÇé¿ö½øÐÐÑ¡Ôñ¡£

ËÄ¡¢ÏßÐÔË÷Òý²éÕÒ

¶ÔÓÚº£Á¿µÄÎÞÐòÊý¾Ý£¬ÎªÁËÌá¸ß²éÕÒËÙ¶È£¬Ò»°ã»áΪÆä¹¹ÔìË÷Òý±í¡£

Ë÷Òý¾ÍÊǰÑÒ»¸ö¹Ø¼ü×ÖÓëËüÏà¶ÔÓ¦µÄ¼Ç¼½øÐйØÁªµÄ¹ý³Ì¡£

Ò»¸öË÷ÒýÓÉÈô¸É¸öË÷ÒýÏî¹¹³É£¬Ã¿¸öË÷ÒýÏîÖÁÉÙ°üº¬¹Ø¼ü×ÖºÍÆä¶ÔÓ¦µÄ¼Ç¼ÔÚ´æ´¢Æ÷ÖеÄλÖõÈÐÅÏ¢¡£

Ë÷Òý°´Õսṹ¿ÉÒÔ·ÖΪ£ºÏßÐÔË÷Òý¡¢Ê÷ÐÎË÷ÒýºÍ¶à¼¶Ë÷Òý¡£

ÏßÐÔË÷Òý£º½«Ë÷ÒýÏîµÄ¼¯ºÏͨ¹ýÏßÐԽṹÀ´×éÖ¯£¬Ò²½ÐË÷Òý±í¡£

ÏßÐÔË÷Òý¿É·ÖΪ£º³íÃÜË÷Òý¡¢·Ö¿éË÷ÒýºÍµ¹ÅÅË÷Òý

  1. ³íÃÜË÷Òý

³íÃÜË÷ÒýÖ¸µÄÊÇÔÚÏßÐÔË÷ÒýÖУ¬ÎªÊý¾Ý¼¯ºÏÖеÄÿ¸ö¼Ç¼¶¼½¨Á¢Ò»¸öË÷ÒýÏî¡£

ÕâÆäʵ¾ÍÏ൱ÓÚ¸øÎÞÐòµÄ¼¯ºÏ£¬½¨Á¢ÁËÒ»ÕÅÓÐÐòµÄÏßÐÔ±í¡£ÆäË÷ÒýÏîÒ»¶¨Êǰ´ÕչؼüÂë½øÐÐÓÐÐòµÄÅÅÁС£

ÕâÒ²Ï൱ÓڰѲéÕÒ¹ý³ÌÖÐÐèÒªµÄÅÅÐò¹¤×÷¸øÌáǰ×öÁË¡£

  1. ·Ö¿éË÷Òý

¸ø´óÁ¿µÄÎÞÐòÊý¾Ý¼¯ºÏ½øÐзֿ鴦Àí£¬Ê¹µÃ¿éÄÚÎÞÐò£¬¿éÓë¿éÖ®¼äÓÐÐò¡£

ÕâÆäʵÊÇÓÐÐò²éÕÒºÍÎÞÐò²éÕÒµÄÒ»ÖÖÖмä״̬»òÕß˵Í×Э״̬¡£ÒòΪÊý¾ÝÁ¿¹ý´ó£¬½¨Á¢ÍêÕûµÄ³íÃÜË÷ÒýºÄʱºÄÁ¦£¬Õ¼ÓÃ×ÊÔ´¹ý¶à£»µ«Èç¹û²»×öÈκÎÅÅÐò»òÕßË÷Òý£¬ÄÇô±éÀúµÄ²éÕÒÒ²ÎÞ·¨½ÓÊÜ£¬Ö»ÄÜÕÛÖУ¬×öÒ»¶¨³Ì¶ÈµÄÅÅÐò»òË÷Òý¡£

·Ö¿éË÷ÒýµÄЧÂʱȱéÀú²éÕÒµÄO(n)Òª¸ßһЩ£¬µ«Óë¶þ·Ö²éÕÒµÄO(logn)»¹ÊÇÒª²î²»ÉÙ¡£

  1. µ¹ÅÅË÷Òý

²»ÊÇÓɼǼÀ´È·¶¨ÊôÐÔÖµ£¬¶øÊÇÓÉÊôÐÔÖµÀ´È·¶¨¼Ç¼µÄλÖã¬ÕâÖÖ±»³ÆÎªµ¹ÅÅË÷Òý¡£ÆäÖмǼºÅ±í´æ´¢¾ßÓÐÏàͬ´Î¹Ø¼ü×ÖµÄËùÓмǼµÄµØÖ·»òÒýÓ㨿ÉÒÔÊÇÖ¸Ïò¼Ç¼µÄÖ¸Õë»ò¸Ã¼Ç¼µÄÖ÷¹Ø¼ü×Ö£©¡£

µ¹ÅÅË÷ÒýÊÇ×î»ù´¡µÄËÑË÷ÒýÇæË÷Òý¼¼Êõ¡£

Îå¡¢¶þ²æÅÅÐòÊ÷

¶þ²æÅÅÐòÊ÷ÓÖ³ÆÎª¶þ²æ²éÕÒÊ÷¡£Ëü»òÕßÊÇÒ»¿Å¿ÕÊ÷£¬»òÕßÊǾßÓÐÏÂÁÐÐÔÖʵĶþ²æÊ÷£º

  • ÈôËüµÄ×ó×ÓÊ÷²»Îª¿Õ£¬Ôò×ó×ÓÊ÷ÉÏËùÓнڵãµÄÖµ¾ùСÓÚËüµÄ¸ù½á¹¹µÄÖµ£»
  • ÈôËüµÄÓÒ×ÓÊ÷²»Îª¿Õ£¬ÔòÓÒ×ÓÊ÷ÉÏËùÓнڵãµÄÖµ¾ù´óÓÚËüµÄ¸ù½á¹¹µÄÖµ£»
  • ËüµÄ×ó¡¢ÓÒ×ÓÊ÷Ò²·Ö±ðΪ¶þ²æÅÅÐòÊ÷¡£

¹¹ÔìÒ»¿Å¶þ²æÅÅÐòÊ÷µÄÄ¿µÄ£¬ÍùÍù²»ÊÇΪÁËÅÅÐò£¬¶øÊÇΪÁËÌá¸ß²éÕҺͲåÈëɾ³ý¹Ø¼ü×ÖµÄËÙ¶È¡£

¶þ²æÅÅÐòÊ÷µÄ²Ù×÷£º

  1. ²éÕÒ£º¶Ô±È½ÚµãµÄÖµºÍ¹Ø¼ü×Ö£¬ÏàµÈÔò±íÃ÷ÕÒµ½ÁË£»Ð¡ÁËÔòÍù½ÚµãµÄ×ó×ÓÊ÷È¥ÕÒ£¬´óÁËÔòÍùÓÒ×ÓÊ÷È¥ÕÒ£¬ÕâôµÝ¹éÏÂÈ¥£¬×îºó·µ»Ø²¼¶ûÖµ»òÕÒµ½µÄ½Úµã¡£
  2. ²åÈ룺´Ó¸ù½Úµã¿ªÊ¼Öð¸öÓë¹Ø¼ü×Ö½øÐжԱȣ¬Ð¡ÁËÈ¥×ó±ß£¬´óÁËÈ¥Óұߣ¬Åöµ½×ÓÊ÷Ϊ¿ÕµÄÇé¿ö¾Í½«ÐµĽڵãÁ´½Ó¡£
  3. ɾ³ý£ºÈç¹ûҪɾ³ýµÄ½ÚµãÊÇÒ¶×Ó£¬Ö±½Óɾ£»Èç¹ûÖ»ÓÐ×ó×ÓÊ÷»òÖ»ÓÐÓÒ×ÓÊ÷£¬Ôòɾ³ý½Úµãºó£¬½«×ÓÊ÷Á´½Óµ½¸¸½Úµã¼´¿É£»Èç¹ûͬʱÓÐ×óÓÒ×ÓÊ÷£¬Ôò¿ÉÒÔ½«¶þ²æÅÅÐòÊ÷½øÐÐÖÐÐò±éÀú£¬È¡½«Òª±»É¾³ýµÄ½ÚµãµÄǰÇý»òÕߺó¼Ì½ÚµãÌæ´úÕâ¸ö±»É¾³ýµÄ½ÚµãµÄλÖá£
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Liu Jiang
# Python 3.5

class BSTNode:
"""
¶¨ÒåÒ»¸ö¶þ²æÊ÷½ÚµãÀà¡£
ÒÔÌÖÂÛË㷨ΪÖ÷£¬ºöÂÔÁËһЩÖîÈç¶ÔÊý¾ÝÀàÐͽøÐÐÅжϵÄÎÊÌâ¡£
"""
def __init__(self, data, left=None, right=None):
"""
³õʼ»¯
:param data: ½Úµã´¢´æµÄÊý¾Ý
:param left: ½Úµã×ó×ÓÊ÷
:param right: ½ÚµãÓÒ×ÓÊ÷
"""
self.data = data
self.left = left
self.right = right

class BinarySortTree:
"""
»ùÓÚBSTNodeÀàµÄ¶þ²æÅÅÐòÊ÷¡£Î¬»¤Ò»¸ö¸ù½ÚµãµÄÖ¸Õë¡£
"""
def __init__(self):
self._root = None
def is_empty(self):
return self._root is None
def search(self, key):
"""
¹Ø¼üÂë¼ìË÷
:param key: ¹Ø¼üÂë
:return: ²éѯ½Úµã»òNone
"""
bt = self._root
while bt:
entry = bt.data
if key < entry:
bt = bt.left
elif key > entry:
bt = bt.right
else:
return entry
return None
def insert(self, key):
"""
²åÈë²Ù×÷
:param key:¹Ø¼üÂë
:return: ²¼¶ûÖµ
"""
bt = self._root
if not bt:
self._root = BSTNode(key)
return
while True:
entry = bt.data
if key < entry:
if bt.left is None:
bt.left = BSTNode(key)
return
bt = bt.left
elif key > entry:
if bt.right is None:
bt.right = BSTNode(key)
return
bt = bt.right
else:
bt.data = key
return
def delete(self, key):
"""
¶þ²æÅÅÐòÊ÷×Ôӵķ½·¨
:param key: ¹Ø¼üÂë
:return: ²¼¶ûÖµ
"""
p, q = None, self._root # ά³ÖpΪqµÄ¸¸½Úµã£¬ÓÃÓÚºóÃæµÄÁ´½Ó²Ù×÷
if not q:
print("¿ÕÊ÷£¡")
return
while q and q.data != key:
p = q
if key < q.data:
q = q.left
else:
q = q.right
if not q: # µ±Ê÷ÖÐûÓйؼüÂëkeyʱ£¬½áÊøÍ˳ö¡£
return
# ÉÏÃæÒѽ«ÕÒµ½ÁËҪɾ³ýµÄ½Úµã£¬ÓÃqÒýÓ᣶øpÔòÊÇqµÄ¸¸½Úµã»òÕßNone£¨qΪ¸ù½Úµãʱ£©¡£
if not q.left:
if p is None:
self._root = q.right
elif q is p.left:
p.left = q.right
else:
p.right = q.right
return
# ²éÕÒ½ÚµãqµÄ×ó×ÓÊ÷µÄ×îÓҽڵ㣬½«qµÄÓÒ×ÓÊ÷Á´½ÓΪ¸Ã½ÚµãµÄÓÒ×ÓÊ÷
# ¸Ã·½·¨¿ÉÄÜ»áÔö´óÊ÷µÄÉî¶È£¬Ð§Âʲ¢²»Ëã¸ß¡£¿ÉÒÔÉè¼ÆÆäËüµÄ·½·¨¡£
r = q.left
while r.right:
r = r.right
r.right = q.right
if p is None:
self._root = q.left
elif p.left is q:
p.left = q.left
else:
p.right = q.left
def __iter__(self):
"""
ʵÏÖ¶þ²æÊ÷µÄÖÐÐò±éÀúËã·¨,
չʾÎÒÃÇ´´½¨µÄ¶þ²æÅÅÐòÊ÷.
Ö±½ÓʹÓÃpythonÄÚÖõÄÁбí×÷Ϊһ¸öÕ»¡£
:return: data
"""
stack = []
node = self._root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
yield node.data
node = node.right

if __name__ == '__main__':
lis = [62, 58, 88, 48, 73, 99, 35, 51, 93, 29, 37, 49, 56, 36, 50]
bs_tree = BinarySortTree()
for i in range(len(lis)):
bs_tree.insert(lis[i])
# bs_tree.insert(100)
bs_tree.delete(58)
for i in bs_tree:
print(i, end=" ")
# print("\n", bs_tree.search(4))

¶þ²æÅÅÐòÊ÷×ܽ᣺

  • ¶þ²æÅÅÐòÊ÷ÒÔÁ´Ê½½øÐд洢£¬±£³ÖÁËÁ´½Ó½á¹¹ÔÚ²åÈëºÍɾ³ý²Ù×÷ÉϵÄÓŵ㡣
  • ÔÚ¼«¶ËÇé¿öÏ£¬²éѯ´ÎÊýΪ1£¬µ«×î´ó²Ù×÷´ÎÊý²»»á³¬¹ýÊ÷µÄÉî¶È¡£Ò²¾ÍÊÇ˵£¬¶þ²æÅÅÐòÊ÷µÄ²éÕÒÐÔÄÜÈ¡¾öÓÚ¶þ²æÅÅÐòÊ÷µÄÐÎ×´£¬Ò²¾ÍÒýÉê³öÁ˺óÃæµÄƽºâ¶þ²æÊ÷¡£
  • ¸ø¶¨Ò»¸öÔªËØ¼¯ºÏ£¬¿ÉÒÔ¹¹Ô첻ͬµÄ¶þ²æÅÅÐòÊ÷£¬µ±ËüͬʱÊÇÒ»¸öÍêÈ«¶þ²æÊ÷µÄʱºò£¬²éÕÒµÄʱ¼ä¸´ÔÓ¶ÈΪO(log(n))£¬½üËÆÓÚ¶þ·Ö²éÕÒ¡£
  • µ±³öÏÖ×¶ËµÄбÊ÷ʱ£¬Æäʱ¼ä¸´ÔÓ¶ÈΪO(n)£¬µÈͬÓÚ˳Ðò²éÕÒ£¬Ð§¹û×î²î¡£

Áù¡¢ ƽºâ¶þ²æÊ÷

ƽºâ¶þ²æÊ÷£¨AVLÊ÷£¬·¢Ã÷ÕßµÄÐÕÃûËõд£©£ºÒ»ÖÖ¸ß¶ÈÆ½ºâµÄÅÅÐò¶þ²æÊ÷£¬Æäÿһ¸ö½ÚµãµÄ×ó×ÓÊ÷ºÍÓÒ×ÓÊ÷µÄ¸ß¶È²î×î¶àµÈÓÚ1¡£

ƽºâ¶þ²æÊ÷Ê×ÏȱØÐëÊÇÒ»¿Ã¶þ²æÅÅÐòÊ÷£¡

ƽºâÒò×Ó£¨Balance Factor£©£º½«¶þ²æÊ÷ÉϽڵãµÄ×ó×ÓÊ÷Éî¶È¼õÈ¥ÓÒ×ÓÊ÷Éî¶ÈµÄÖµ¡£

¶ÔÓÚÆ½ºâ¶þ²æÊ÷ËùÓаüÀ¨·ÖÖ§½ÚµãºÍÒ¶½ÚµãµÄƽºâÒò×ÓÖ»¿ÉÄÜÊÇ-1,0ºÍ1£¬Ö»ÒªÓÐÒ»¸ö½ÚµãµÄÒò×Ó²»ÔÚÕâÈý¸öÖµÖ®ÄÚ£¬¸Ã¶þ²æÊ÷¾ÍÊDz»Æ½ºâµÄ¡£

×îС²»Æ½ºâ×ÓÊ÷£º¾àÀë²åÈë½áµã×î½üµÄ£¬ÇÒÆ½ºâÒò×ӵľø¶ÔÖµ´óÓÚ1µÄ½ÚµãΪ¸ùµÄ×ÓÊ÷¡£

ƽºâ¶þ²æÊ÷µÄ¹¹½¨Ë¼Ï룺ÿµ±²åÈëÒ»¸öнáµãʱ£¬Ïȼì²éÊÇ·ñÆÆ»µÁËÊ÷µÄƽºâÐÔ£¬ÈôÓУ¬ÕÒ³ö×îС²»Æ½ºâ×ÓÊ÷¡£ÔÚ±£³Ö¶þ²æÅÅÐòÊ÷ÌØÐÔµÄǰÌáÏ£¬µ÷Õû×îС²»Æ½ºâ×ÓÊ÷Öи÷½áµãÖ®¼äµÄÁ¬½Ó¹ØÏµ£¬½øÐÐÏàÓ¦µÄÐýת£¬³ÉΪÐÂµÄÆ½ºâ×ÓÊ÷¡£

ÏÂÃæÊÇÓÉ[1,2,3,4,5,6,7,10,9]¹¹½¨Æ½ºâ¶þ²æÊ÷

Æß¡¢¶à·²éÕÒÊ÷£¨BÊ÷£©

¶à·²éÕÒÊ÷£¨muitl-way search tree£©£ºÆäÿһ¸ö½ÚµãµÄº¢×Ó¿ÉÒÔ¶àÓÚÁ½¸ö£¬ÇÒÿһ¸ö½áµã´¦¿ÉÒÔ´æ´¢¶à¸öÔªËØ¡£

¶ÔÓÚ¶à·²éÕÒÊ÷£¬Ã¿¸ö½Úµã¿ÉÒÔ´æ´¢¶àÉÙ¸öÔªËØ£¬ÒÔ¼°ËüµÄº¢×ÓÊýµÄ¶àÉÙÊǹؼü£¬³£ÓõÄÓÐÕâ4ÖÖÐÎʽ£º2-3Ê÷¡¢2-3-4Ê÷¡¢BÊ÷ºÍB+Ê÷¡£

2-3Ê÷

2-3Ê÷£ºÃ¿¸ö½áµã¶¼¾ßÓÐ2¸öº¢×Ó£¬»òÕß3¸öº¢×Ó£¬»òÕßûÓк¢×Ó¡£

Ò»¸ö2½áµã°üº¬Ò»¸öÔªËØºÍÁ½¸öº¢×Ó£¨»òÕßûÓк¢×Ó£¬²»ÄÜÖ»ÓÐÒ»¸öº¢×Ó£©¡£Óë¶þ²æÅÅÐòÊ÷ÀàËÆ£¬Æä×ó×ÓÊ÷°üº¬µÄÔªËØ¶¼Ð¡ÓÚ¸ÃÔªËØ£¬ÓÒ×ÓÊ÷°üº¬µÄÔªËØ¶¼´óÓÚ¸ÃÔªËØ¡£

Ò»¸ö3½áµã°üº¬Á½¸öÔªËØºÍÈý¸öº¢×Ó£¨»òÕßûÓк¢×Ó£¬²»ÄÜÖ»ÓÐÒ»¸ö»òÁ½¸öº¢×Ó£©¡£

2-3Ê÷ÖÐËùÓеÄÒ¶×Ó¶¼±ØÐëÔÚͬһ²ã´ÎÉÏ¡£

Æä²åÈë²Ù×÷ÈçÏ£º

Æäɾ³ý²Ù×÷ÈçÏ£º

2-3-4Ê÷

Æäʵ¾ÍÊÇ2-3Ê÷µÄÀ©Õ¹£¬°üÀ¨ÁË4½áµãµÄʹÓá£Ò»¸ö4½áµã°üº¬Ð¡ÖдóÈý¸öÔªËØºÍËĸöº¢×Ó£¨»òûÓк¢×Ó£©¡£

Æä²åÈë²Ù×÷:

Æäɾ³ý²Ù×÷£º

BÊ÷

BÊ÷ÊÇÒ»ÖÖÆ½ºâµÄ¶à·²éÕÒÊ÷¡£½Úµã×î´óµÄº¢×ÓÊýÄ¿³ÆÎªBÊ÷µÄ½×£¨order£©¡£2-3Ê÷ÊÇ3½×BÊ÷£¬2-3-4ÊÇ4½×BÊ÷¡£

BÊ÷µÄÊý¾Ý½á¹¹Ö÷ÒªÓÃÔÚÄÚ´æºÍÍⲿ´æ´¢Æ÷µÄÊý¾Ý½»»¥ÖС£

B+Ê÷

ΪÁ˽â¾öBÊ÷µÄËùÓÐÔªËØ±éÀúµÈ»ù±¾ÎÊÌ⣬ÔÚÔ­ÓеĽṹ»ù´¡ÉÏ£¬¼ÓÈëеÄÔªËØ×éÖ¯·½Ê½ºó£¬ÐγÉÁËB+Ê÷¡£

B+Ê÷ÊÇÓ¦ÎļþϵͳËùÐè¶ø³öÏÖµÄÒ»ÖÖBÊ÷µÄ±äÐÎÊ÷£¬ÑϸñÒâÒåÉϽ«£¬ËüÒѾ­²»ÊÇ×î»ù±¾µÄÊ÷ÁË¡£

B+Ê÷ÖУ¬³öÏÖÔÚ·ÖÖ§½ÚµãÖеÄÔªËØ»á±»µ±×öËûÃÇÔڸ÷ÖÖ§½ÚµãλÖõÄÖÐÐòºó¼ÌÕߣ¨Ò¶×ӽڵ㣩ÖÐÔÙ´ÎÁгö¡£ÁíÍ⣬ÿһ¸öÒ¶×ӽڵ㶼»á±£´æÒ»¸öÖ¸ÏòºóÒ»Ò¶×Ó½ÚµãµÄÖ¸Õë¡£

ËùÓеÄÒ¶×Ó½Úµã°üº¬È«²¿µÄ¹Ø¼ü×ÖµÄÐÅÏ¢£¬¼°Ïà¹ØÖ¸Õ룬Ҷ×ӽڵ㱾ÉíÒÀ¹Ø¼ü×ֵĴóС×ÔСµ½´ó˳ÐòÁ´½Ó

B+Ê÷µÄ½á¹¹ÌرðÊʺϴøÓз¶Î§µÄ²éÕÒ¡£±ÈÈç²éÕÒÄêÁäÔÚ20~30ËêÖ®¼äµÄÈË¡£

°Ë¡¢É¢ÁÐ±í£¨¹þÏ£±í£©

É¢ÁÐ±í£ºËùÓеÄÔªËØÖ®¼äûÓÐÈκιØÏµ¡£ÔªËصĴ洢λÖã¬ÊÇÀûÓÃÔªËØµÄ¹Ø¼ü×Öͨ¹ýij¸öº¯ÊýÖ±½Ó¼ÆËã³öÀ´µÄ¡£Õâ¸öÒ»Ò»¶ÔÓ¦µÄ¹ØÏµº¯Êý³ÆÎªÉ¢Áк¯Êý»òHashº¯Êý¡£
²ÉÓÃÉ¢Áм¼Êõ½«¼Ç¼´æ´¢ÔÚÒ»¿éÁ¬ÐøµÄ´æ´¢¿Õ¼äÖУ¬³ÆÎªÉ¢Áбí»ò¹þÏ£±í£¨Hash Table£©¡£¹Ø¼ü×Ö¶ÔÓ¦µÄ´æ´¢Î»Ö㬳ÆÎªÉ¢ÁеØÖ·¡£

É¢ÁбíÊÇÒ»ÖÖÃæÏò²éÕҵĴ洢½á¹¹¡£Ëü×îÊʺÏÇó½âµÄÎÊÌâÊDzéÕÒÓë¸ø¶¨ÖµÏàµÈµÄ¼Ç¼¡£µ«ÊǶÔÓÚij¸ö¹Ø¼ü×ÖÄܶÔÓ¦ºÜ¶à¼Ç¼µÄÇé¿ö¾Í²»ÊÊÓ㬱ÈÈç²éÕÒËùÓеġ°ÄС±ÐÔ¡£Ò²²»ÊʺϷ¶Î§²éÕÒ£¬±ÈÈç²éÕÒÄêÁä20~30Ö®¼äµÄÈË¡£ÅÅÐò¡¢×î´ó¡¢×îСµÈÒ²²»ºÏÊÊ¡£

Òò´Ë£¬É¢Áбíͨ³£ÓÃÓڹؼü×Ö²»Öظ´µÄÊý¾Ý½á¹¹¡£±ÈÈçpythonµÄ×ÖµäÊý¾ÝÀàÐÍ¡£

Éè¼Æ³öÒ»¸ö¼òµ¥¡¢¾ùÔÈ¡¢´æ´¢ÀûÓÃÂʸߵÄÉ¢Áк¯ÊýÊÇÉ¢Áм¼ÊõÖÐ×î¹Ø¼üµÄÎÊÌâ¡£
µ«ÊÇ£¬Ò»°ãÉ¢Áк¯Êý¶¼ÃæÁÙ×ųåÍ»µÄÎÊÌâ¡£
³åÍ»£ºÁ½¸ö²»Í¬µÄ¹Ø¼ü×Ö£¬Í¨¹ýÉ¢Áк¯Êý¼ÆËãºó½á¹ûÈ´ÏàͬµÄÏÖÏó¡£collision¡£

8.1 É¢Áк¯ÊýµÄ¹¹Ôì·½·¨

ºÃµÄÉ¢Áк¯Êý£º¼ÆËã¼òµ¥¡¢É¢ÁеØÖ··Ö²¼¾ùÔÈ

  1. Ö±½Ó¶¨Ö··¨
    ÀýÈçÈ¡¹Ø¼ü×ÖµÄij¸öÏßÐÔº¯ÊýΪɢÁк¯Êý£º
    f(key) = a*key + b (a,bΪ³£Êý£©
  2. Êý×Ö·ÖÎö·¨
    ³éÈ¡¹Ø¼ü×ÖÀïµÄÊý×Ö£¬¸ù¾ÝÊý×ÖµÄÌØµã½øÐеØÖ··ÖÅä
  3. ƽ·½È¡Öз¨
    ½«¹Ø¼ü×ÖµÄÊý×ÖÇ󯽷½£¬ÔÙ½ØÈ¡²¿·Ö
  4. ÕÛµþ·¨
    ½«¹Ø¼ü×ÖµÄÊý×Ö·Ö¸îºó·Ö±ð¼ÆË㣬Ôٺϲ¢¼ÆË㣬һÖÖÍæÅªÊý×ÖµÄÊֶΡ£
  5. ³ýÁôÓàÊý·¨
    ×îΪ³£¼ûµÄ·½·¨Ö®Ò»¡£
    ¶ÔÓÚ±í³¤ÎªmµÄÊý¾Ý¼¯ºÏ£¬É¢Áй«Ê½Îª£º
    f(key) = key mod p (p<=m)
    mod£ºÈ¡Ä££¨ÇóÓàÊý£©
    ¸Ã·½·¨×î¹Ø¼üµÄÊÇpµÄÑ¡Ôñ£¬¶øÇÒÊý¾ÝÁ¿½Ï´óµÄʱºò£¬³åÍ»ÊDZØÈ»µÄ¡£Ò»°ã»áÑ¡Ôñ½Ó½ümµÄÖÊÊý¡£
  6. Ëæ»úÊý·¨
    Ñ¡ÔñÒ»¸öËæ»úÊý£¬È¡¹Ø¼ü×ÖµÄËæ»úº¯ÊýֵΪËüµÄÉ¢ÁеØÖ·¡£
    f(key) = random(key)

×ܽᣬʵ¼ÊÇé¿öϸù¾Ý²»Í¬µÄÊý¾ÝÌØÐÔ²ÉÓò»Í¬µÄÉ¢Áз½·¨£¬¿¼ÂÇÏÂÃæÒ»Ð©Ö÷ÒªÎÊÌ⣺

  • ¼ÆËãÉ¢ÁеØÖ·ËùÐèµÄʱ¼ä
  • ¹Ø¼ü×ֵij¤¶È
  • É¢ÁбíµÄ´óС
  • ¹Ø¼ü×ֵķֲ¼Çé¿ö
  • ¼Ç¼²éÕ񵀮µÂÊ

8.2 ´¦ÀíÉ¢ÁгåÍ»

  • ¿ª·Å¶¨Ö··¨

¾ÍÊÇÒ»µ©·¢Éú³åÍ»£¬¾ÍȥѰÕÒÏÂÒ»¸ö¿ÕµÄÉ¢ÁеØÖ·£¬Ö»ÒªÉ¢Áбí×ã¹»´ó£¬¿ÕµÄÉ¢ÁеØÖ·×ÜÄÜÕÒµ½£¬²¢½«¼Ç¼´æÈë¡£

¹«Ê½ÊÇ£º

ÕâÖÖ¼òµ¥µÄ³åÍ»½â¾ö°ì·¨±»³ÆÎªÏßÐÔ̽²â£¬Î޷ǾÍÊÇ×ԼҵĿӱ»Õ¼ÁË£¬¾ÍÖð¸ö°Ý·ÃºóÃæµÄ¿Ó£¬Óпյľͽø£¬Ò²²»¹ÜÕâ¸ö¿ÓÊDz»ÊǺóÃæÓÐÈËÔ¤¶¨Á˵ġ£

ÏßÐÔ̽²â´øÀ´µÄ×î´óÎÊÌâ¾ÍÊdzåÍ»µÄ¶Ñ»ý£¬Äã°Ñ±ðÈËÔ¤¶¨µÄ¿ÓÕ¼ÁË£¬±ðÈËÒ²¾ÍÒªÏñÄãÒ»ÑùÈ¥ÕÒ¿Ó¡£

¸Ä½øµÄ°ì·¨Óжþ´Î·½Ì½²â·¨ºÍËæ»úÊý̽²â·¨¡£

  • ÔÙÉ¢Áк¯Êý·¨
    ·¢Éú³åͻʱ¾Í»»Ò»¸öÉ¢Áк¯Êý¼ÆË㣬×Ü»áÓÐÒ»¸ö¿ÉÒ԰ѳåÍ»½â¾öµô£¬ËüÄܹ»Ê¹µÃ¹Ø¼ü×Ö²»²úÉú¾Û¼¯£¬µ«ÏàÓ¦µØÔö¼ÓÁ˼ÆËãµÄʱ¼ä¡£
  • Á´½ÓµØÖ··¨
    Åöµ½³åͻʱ£¬²»¸ü»»µØÖ·£¬¶øÊǽ«ËùÓйؼü×ÖΪͬÒå´ÊµÄ¼Ç¼´æ´¢ÔÚÒ»¸öÁ´±íÀÔÚÉ¢ÁбíÖÐÖ»´æ´¢Í¬Òå´Ê×Ó±íµÄÍ·Ö¸Õ룬ÈçÏÂͼ£º

ÕâÑùµÄºÃ´¦ÊÇ£¬²»Å³åÍ»¶à£»È±µãÊǽµµÍÁËÉ¢ÁнṹµÄËæ»ú´æ´¢ÐÔÄÜ¡£±¾ÖÊÊÇÓõ¥Á´±í½á¹¹¸¨ÖúÉ¢ÁнṹµÄ²»×ã¡£

  • ¹«¹²Òç³öÇø·¨
    Æäʵ¾ÍÊÇΪËùÓеijåÍ»£¬¶îÍ⿪±ÙÒ»¿é´æ´¢¿Õ¼ä¡£Èç¹ûÏà¶Ô»ù±¾±í¶øÑÔ£¬³åÍ»µÄÊý¾ÝºÜÉÙµÄʱºò£¬Ê¹ÓÃÕâÖÖ·½·¨±È½ÏºÏÊÊ¡£

8.3 É¢Áбí²éÕÒʵÏÖ

ÏÂÃæÊÇÒ»¶Î¼òµ¥µÄʵÏÖ´úÂ룺

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: Liu Jiang
# Python 3.5
# ºöÂÔÁ˶ÔÊý¾ÝÀàÐÍ£¬ÔªËØÒç³öµÈÎÊÌâµÄÅжϡ£

class HashTable:
def __init__(self, size):
self.elem = [None for i in range(size)] # ʹÓÃlistÊý¾Ý½á¹¹×÷Ϊ¹þÏ£±íÔªËØ±£´æ·½·¨
self.count = size # ×î´ó±í³¤
def hash(self, key):
return key % self.count # É¢Áк¯Êý²ÉÓóýÁôÓàÊý·¨
def insert_hash(self, key):
"""²åÈë¹Ø¼ü×Öµ½¹þÏ£±íÄÚ"""
address = self.hash(key) # ÇóÉ¢ÁеØÖ·
while self.elem[address]: # µ±Ç°Î»ÖÃÒѾ­ÓÐÊý¾ÝÁË£¬·¢Éú³åÍ»¡£
address = (address+1) % self.count # ÏßÐÔ̽²âÏÂÒ»µØÖ·ÊÇ·ñ¿ÉÓÃ
self.elem[address] = key # ûÓгåÍ»ÔòÖ±½Ó±£´æ¡£
def search_hash(self, key):
"""²éÕҹؼü×Ö£¬·µ»Ø²¼¶ûÖµ"""
star = address = self.hash(key)
while self.elem[address] != key:
address = (address + 1) % self.count
if not self.elem[address] or address == star: # ˵Ã÷ûÕÒµ½»òÕßÑ­»·µ½ÁË¿ªÊ¼µÄλÖÃ
return False
return True

if __name__ == '__main__':
list_a = [12, 67, 56, 16, 25, 37, 22, 29, 15, 47, 48, 34]
hash_table = HashTable(12)
for i in list_a:
hash_table.insert_hash(i)
for i in hash_table.elem:
if i:
print((i, hash_table.elem.index(i)), end=" ")
print("\n")
print(hash_table.search_hash(15))
print(hash_table.search_hash(33))

8.4 É¢Áбí²éÕÒÐÔÄÜ·ÖÎö

Èç¹ûû·¢Éú³åÍ»£¬ÔòÆä²éÕÒʱ¼ä¸´ÔÓ¶ÈΪO(1)£¬ÊôÓÚ×¶ËµÄºÃÁË¡£

µ«ÊÇ£¬ÏÖʵÖгåÍ»¿É²»¿É±ÜÃâµÄ£¬ÏÂÃæÈý¸ö·½Ãæ¶Ô²éÕÒÐÔÄÜÓ°Ïì½Ï´ó£º

  • É¢Áк¯ÊýÊÇ·ñ¾ùÔÈ
  • ´¦Àí³åÍ»µÄ°ì·¨
  • É¢ÁбíµÄ×°ÌîÒò×Ó£¨±íÄÚÊý¾Ý×°ÂúµÄ³Ì¶È£©
   
2988 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ