[Algorithmic Toolbox学习笔记][week4]Divide and conquer

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 

index01234567
value15520352416717

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 

index0123456789
value179255897163455923

Binary search的逻辑:
1. 首先将值按照从小到达的顺序排列;
2. 找到处于最中间的值,用这个值与要查找的值进行比较:
        a. 如果中间值大于要查找的值,那么程序会在中间值左边的值里面查找(查找方式同步骤2)
        b. 如果中间值小于要查找的值,那么程序会在中间值右边的值里面查找(查找方式同步骤2)

比如以上的例子中,如果我们要查找63(key = 63):
1. 首先重新排序得到以下列表。
index0123456789
value491723254559637189

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值