Main idea of divide and conquer
1. Break into non-overlapping subproblems of the same type
重点一:non- overlapping (如果被分解后的问题之间有重叠,不行)
重点二:same type (如果被分解后的问题类型不一致(有三角形有长方形),不行)
正确分解问题的方式(分解后的问题无重叠,且是同一类型)
2. Solve subproblems
3. Combine results
linear Search
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
value | 15 | 5 | 20 | 35 | 2 | 41 | 67 | 17 |
linear search的逻辑:单线程按照index依次去查找value = k的元素 (k为我们要找的值)。
比如以上的例子中,如果我们要查找41(key = 41),从index = 0 开始:
1. index = 0 时,0对应的值与key值不相等(15 ≠ 41) --> 查找下一个
2. index = 1 时,0对应的值与key值不相等(5 ≠ 41) --> 查找下一个
...
3. index = 5 时,0对应的值与key值相等(41 = 41) --> 找到了 --> return 5
如果low表示第一个元素的index值,high表示最后一个元素的index值,A表示要查找的数列,key表示要查找的值。那么linear search的公式为:
用python3来实现linear search的话,代码如下:
def linearSearch(arr, low, high, key):
if high >= low:
if arr[low] == key:
return low
return linearSearch(arr, low + 1, high, key)
#else表示数组为空,或者找完数组内所有元素都没有要查找的值则返回-1
else:
return -1
arr = [15, 5, 20, 35, 2, 41, 67, 17]
key = 41
result = linearSearch(arr, 0, len(arr)-1, key)
if result == -1:
print('Element is not present in array')
else:
print('Element is present at index % d' % result)
Binary Search
index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
value | 17 | 9 | 25 | 5 | 89 | 71 | 63 | 45 | 59 | 23 |
Binary search的逻辑:
1. 首先将值按照从小到达的顺序排列;
2. 找到处于最中间的值,用这个值与要查找的值进行比较:
a. 如果中间值大于要查找的值,那么程序会在中间值左边的值里面查找(查找方式同步骤2)
b. 如果中间值小于要查找的值,那么程序会在中间值右边的值里面查找(查找方式同步骤2)
比如以上的例子中,如果我们要查找63(key = 63):
1. 首先重新排序得到以下列表。
index 0 1 2 3 4 5 6 7 8 9 value 4 9 17 23 25 45 59 63 71 89 2. 此时的low = 0, hight = 9, mid = 0 + (9-0)//2 = 4
用中间值与key比较:25 < 63 --> 在后半段查找
4. 此时的low = 5, hight = 9, mid = 5 + (9-4)//2 = 7
用中间值与key比较:63 = 63 --> 找到值 --> return mid
如果low表示第一个元素的index值,high表示最后一个元素的index值,A表示要查找的数列,key表示要查找的值,mid表示中间值的index。那么Binary search的公式为:
用python3来实现Binary search的话,代码如下:
def binarySearch(arr, low, high, key):
if high >= low:
mid = low + (high - low) // 2
if arr[mid] == key:
return mid
elif arr[mid] > key:
return binarySearch(arr, low, mid-1, key)
else:
return binarySearch(arr, mid + 1, high, key)
#else表示数组为空,或者找完数组内所有元素都没有要查找的值则返回-1
else:
return -1
list = [17, 9, 25, 5, 89, 71, 63, 45, 59, 23]
arr = sorted(list)
key = 63
result = binarySearch(arr, 0, len(arr)-1, key)
if result == -1:
print('Element is not present in array')
else:
print('Element is present at index % d' % result)