【发布时间】:2021-06-20 19:09:48
【问题描述】:
TL;DR - 一种非比较排序算法,其执行时间根据数据类型中的位数进行缩放;如何正确评估 Big O 时间复杂度?
我有一个排序算法“Bitsort”,它的时间复杂度取决于被排序的数据类型中的位数,而不是被排序的列表的长度;对于长度从 2 个元素到最大可寻址大小的列表,完全排序所需的整个列表的传递次数由列表中使用的数据类型的大小决定。 bitsort 的简单版本(下面未优化但工作的代码示例)一次对列表进行 1 位排序。在现实世界中,这通常意味着 32 位系统在数据类型和待排序列表的最大长度中都有 32 位;并且 2^32 的 Log-base2 是 32。因此,可以说简单位排序的时间复杂度从 O(NB),其中 B 是位数,到 O(NLogN),因为 N 进入最大长度数组系统可以处理。但是,从绝对意义上讲,随着 N 趋于无穷大,B 保持不变,因此可以说时间复杂度为 O(N)。
应该如何评估简单位排序的时间复杂度?
import sys
from random import randrange
def checkOrder(arr):
for i in range(1, len(arr)):
if arr[i - 1] > arr[i]:
return False
return True
def randomArray(length, height):
result = []
for i in range(0, length):
result.append(randrange(0, height, 1))
return result
def swap(arr, left, right):
temp = arr[left]
arr[left] = arr[right]
arr[right] = temp
# pat. pending, but not a troll
def bitsort(arr, begin, end, shiftBit):
if end-begin <= 0 or shiftBit < 0:
return
LP, RP = begin - 1, end + 1
mask = 0b1 << shiftBit
while True:
LP += 1
if LP > end:
bitsort(arr, begin, end, shiftBit - 1)
return
elif LP == RP:
if LP <= begin: # left has 0 or 1 el
pass
else:
bitsort(arr, begin, LP - 1, shiftBit - 1)
if RP >= end: # right has 0 or 1 elements
pass
else:
bitsort(arr, RP, end, shiftBit - 1)
return
if arr[LP] & mask == 0:
continue
else:
while True:
RP -= 1
if RP < begin:
bitsort(arr, begin, end, shiftBit - 1)
return
elif LP == RP:
if LP <= begin:
if RP <= end:
bitsort(arr, begin, end, shiftBit - 1)
return
else:
pass
else:
bitsort(arr, begin, LP - 1, shiftBit - 1)
if RP >= end:
pass
else:
bitsort(arr, RP, end, shiftBit - 1)
return
if (arr[RP] & mask) >> shiftBit == 1:
continue
else:
swap(arr, LP, RP)
break
def main(args):
arr = randomArray(1000000, 2147483648)
bitsort(arr, 0, len(arr) - 1, 31)
print(f'Proper order: {checkOrder(arr)}')
if __name__ == '__main__':
main(sys.argv[1:])
【问题讨论】: