分治策略
分治算法应该算是目前最著名的算法设计技术了,很多高效的算法都是分治法或分治法的稍加改进。分治法可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后让他们彼此异化。
分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治法所能解决的问题一般具有以下几个特征:
- 该问题的规模缩小到一定的程度就可以容易地解决
- 该问题可以分解为若干个规模较小的相同问题,即该问题具有最 优子结构性质。
- 利用该问题分解出的子问题的解可以合并为该问题的解;
- 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
归并排序
归并排序便是一个完美的利用分治法解决问题的例子。我们已经学习过了选择排序和冒泡排序,不知大家有没有觉得这两个算法写起来的感觉很像(没错,都是两重for循环,哈哈哈),今天的归并排序会让你有不一样的感觉。
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤三直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
归并排序的python实现
def Merge(a1,a2):
result=[]
while len(a1)>0 and len(a2)>0:
if a1[0]<= a2[0]:
result.append(a1.pop(0))
else:
result.append(a2.pop(0))
result += a1
result += a2
return result
def MergeSort(slist):
if len(slist) == 1:
return slist
mid = len(slist)//2
left = slist[:mid]
right = slist[mid:]
l=MergeSort(left)
r=MergeSort(right)
return Merge(l,r)
欢迎关注公众号 : 数学算法实验室
算法与人工智能领域