算法(0)——对数器
定义
对数器是通过大量的测试数据来验证算法是否正确的方式
对数器核心部件有两个:
- 绝对正确的方法
- 能产生大量随机样例的随机发生器
对数器的使用
- 有一个你要测的方法a
- 实现一个绝对正确但是复杂度不好的方法b
- 实现一个随机数样本发生器
- 把a和b对比很多次来验证方法a是否正确
- 如果有一样本对比出错,打印该样本
- 当数量很多对比依旧正确时,可以确定a正确
按步骤写代码
一、要测试的方法a
以下是快排算法对的一种新的实现方法
def qS(array,start,end):
if start >= end:
return array
if start + 1 == end:
if array[start] > array[end]:
array[start],array[end] = array[end],array[start]
else:
return array
if start+1 < end:
# set up flag(flag is the first param),and set a pointer(is uesed to traves the array),and a count(is used to count the number greater than flag)
flag = array[start]
pointer = start + 1
count = 0
if pointer == end:
return array
else:
for i in range(start,end):
if flag < array[pointer]:
pointer += 1
elif flag >= array[pointer]:
array[count + start + 1],array[pointer] = array[pointer],array[count + start + 1]
count += 1
pointer += 1
array[start],array[start+count] = array[start+count],array[start]
# recursion sort
qS(array, start, start + count - 1)
qS(array, start + count + 1, end)
def quicklySort(array):
'''
packaged sort function
:param array: the array to sort
:return: sorted array
'''
start = 0
end = array.__len__() - 1
qS(array,start,end)
quicklySort(array)
print(array)
输入array = [9,8,7,6,5,4,3,2,1,0],返回array的值为[0,1,2,3,4,5,6,7,8,9]
下面是此算法的手稿图(不感兴趣的话请略过,写的有点点乱~):
二、绝对正确但是复杂度不好的方法b
这里选择Python自带的排序array.sort()方法
def correctSort(array):
array.sort()
print(array)
三、实现一个随机样本发生器
import random
def generateRandomArray(maxSize):
size = int(maxSize * random.random() + 1 )
array = []
for i in range(size):
array.append(int(10 * random.random()) - int(10 * random.random()))
return(array)
四、对比a和b返回的结果,验证a是否正确
array1 = quicklySort(array)
array2 = correctSort(array)
if array1 == array2:
print("OK!")
else:
print("错误样例:\n" + array1 + '\n' + array2)
于是乎,Python对数器出炉啦~,完整代码如下:
def qS(array,start,end):
if start >= end:
return array
if start + 1 == end:
if array[start] > array[end]:
array[start],array[end] = array[end],array[start]
else:
return array
if start+1 < end:
# set up flag(flag is the first param),and set a pointer(is uesed to traves the array),and a count(is used to count the number greater than flag)
flag = array[start]
pointer = start + 1
count = 0
if pointer == end:
return array
else:
for i in range(start,end):
if flag < array[pointer]:
pointer += 1
elif flag >= array[pointer]:
array[count + start + 1],array[pointer] = array[pointer],array[count + start + 1]
count += 1
pointer += 1
array[start],array[start+count] = array[start+count],array[start]
# recursion sort
qS(array, start, start + count - 1)
qS(array, start + count + 1, end)
def quicklySort(array):
'''
packaged sort function
:param array: the array to sort
:return: sorted array
'''
start = 0
end = array.__len__() - 1
qS(array,start,end)
def correctSort(array):
array.sort()
import random
def generateRandomArray(maxSize):
size = int(maxSize * random.random() + 1 )
array = []
for i in range(size):
array.append(int(10 * random.random()) - int(10 * random.random()))
return(array)
for i in range(5000):
array = generateRandomArray(5)
array1 = quicklySort(array)
array2 = correctSort(array)
if array1 == array2:
print("OK!")
else:
print("错误样例:\n" + array1 + '\n' + array2)