哈希表搜索法
数组的特点是:寻址容易,插入和删除困难。
而链表的特点是:寻址困难,插入和删除容易。
哈希表就是把数组和链表相结合,即可以通过索引快速找到想找的值,也可以通过里面的链表进行插入和删除。在python中就是用字典来实现这个功能的,可以通过字典里的key快速找到想找的值,也可以删除这个值。插入可以随便插,因为是个无序的列表。
字典的定义:
字典是"键值对"的无序可变序列,字典中的每个元素都是一个"键值对",包含:“键对象”,和"值对象"。可以通过"键对象"实现快速获取,删除,更新对应的"值对象"。
{}内用逗号分隔开多个key:value,其中value可以使任意类型,但是key必须是不可变类型,且不能重复。
Python中的字典底层是通过散列表(哈希表)来实现的, “哈希表是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。”
题目(leetcode 167):
解法就是用字典去存储数,先循环遍历数组里的值,然后用目标值去减去想要准备存储进字典的数字,如果答案等于存进字典的某个值时,输出准备存进字典的数字和字典里的那个值得下标。然后答案不等于字典里的值时,就把这个准备储存进字典的数组存进字典里。
def twoSum(self,nums,target):
dic = {}
for i,j in enumerate(nums):
if target - j in dic:
return [dic[target - j],i]
else:
dic[j] = i
二分查找
二分查找法中,数组一定是一个单调性的数组。它是一个定义一个头指针和一个尾指针,通过头尾指针的中间值和目标值对比大小的方法来缩减头尾指针的搜寻范围(当中间值大于目标值时,尾指针就等于中间的值减1。当中间值小于目标值时,头指针就等于中间的值加1),最终当这个变化的头尾指针的中间值等于目标值时停止循环,或者头尾的指针相等或者头指针大于尾指针时停止循环。
时间复杂度为O(log n)
题目:
在一个[13,15,18,22,28,34,56,65,70,80]的数组中,22这个数子是否在这个数组内。
def binarySearch(nums,target):
left = 0
right = len(nums) - 1
while(left <= right):
mid = (right + left) / 2
if num[mid] == target:
return True
elif num[mid] < target:
left = mid + 1
else:
right = mid - 1
return False