Python 数据结构.docx

Python 数据结构

Python Data Structures 搜索 参考内容: 1. HYPERLINK /courselib/static/pythonds/index.html Problem Solving with Python Chapter5: Search and Sorting? HYPERLINK /courselib/static/pythonds/SortSearch/searching.html \l searching online_link 2. HYPERLINK /wiki/Introduction_to_Algorithms 算法导论 搜索(或查找)总结 (1)顺序查找:O(n) (2)二分查找:O(lgn) (3)Hash查找:O(1) 概念:hash,hash table,hash function? HYPERLINK /wiki/%E5%93%88%E5%B8%8C%E8%A1%A8 \l .E5.A4.84.E7.90.86.E7.A2.B0.E6.92.9E 哈希表_on_wiki 常用的哈希函数: 1.reminder method:取余数(size=11,下图对11取余数,例如17取余数得到6) 2.folding method: 分组求和再取余数 3.mid-square method:平方值的中间两位数取余数 4.对于由字符的元素可以尝试使用ord函数来将字符串转换成一个有序的数值序列。在Python中ord函数可以得到对应字符的ASCII码值。将所有字符的码值累加再取余数。 但是,对于通过回文构词法构成的字符串它们得到的值总是一样,为了解决这个问题,可以根据字符的位置添加一个权重。 From wiki 使用哈希查找,难免遇到冲突,该如何解决冲突(Collision Resolution)呢? 常用的解决冲突的办法: 1.open address(开放寻址):线性探测(linear probing)下一个位置,缺点是容易造成聚集现象(cluster),解决聚集现象的办法是跳跃式地查找下一个空槽。数值的顺序:(54, 26, 93, 17, 77, 31, 44, 55, 20). 2.quadratic probing(平方探测):一开始的hash值为h,如果不是空槽,那就尝试h+1,还不是空槽就尝试h+4,依次继续尝试h+9,h+16等等。 3.chain:利用链表链接起来 From wiki 分析hash查找的性能:一般使用平均查找长度来衡量,和装载因子有关 散列表的载荷因子定义为:α?= 填入表中的元素个数 / 散列表的长度? α是散列表装满程度的标志因子。由于表长是定值,α与“填入表中的元素个数”成正比,所以,α越大,表明填入表中的元素越多,产生冲突的可能性就越大;反之,α越小,标明填入表中的元素越少,产生冲突的可能性就越小。实际上,散列表的平均查找长度是载荷因子α的函数,只是不同处理冲突的方法有不同的函数。? 对于开放定址法,荷载因子是特别重要因素,应严格限制在0.7-0.8以下。超过0.8,查表时的CPU缓存不命中(cache missing)按照指数曲线上升。因此,一些采用开放定址法的hash库,如Java的系统库限制了荷载因子为0.75,超过此值将resize散列表。 From wiki 下面的代码包含了顺序查找,二分查找,哈希查找(size=11, plus 1, reminder method) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106def sequential_search(a_list, item): pos = 0 found = False while pos len(a_list) and not found: if a_list[pos] == item: found = True else: pos = pos+1 return foun

文档评论(0)

1亿VIP精品文档

相关文档