【问题标题】:Why is Time Complexity of Bucket Sort is O(n^2) and not O(log(n) * n^2)?为什么桶排序的时间复杂度是 O(n^2) 而不是 O(log(n) * n^2)?
【发布时间】:2021-08-13 01:39:36
【问题描述】:
import math

def insertionSort(arr):
    for i in range(len(arr)-1):
        for j in range(i+1, len(arr)):
            if arr[j] < arr[i]:
                arr[j], arr[i] = arr[i], arr[j]
    return arr


def bucketSort(arr):    
    no_of_buck =  round(math.sqrt(len(arr)))
    bucketArr = [[] for _ in range(no_of_buck)]
    n = len(bucketArr)
    maximumVal = max(arr)

    for i in arr:
        appropriate_bucket = math.ceil(i * n / maximumVal)
        bucketArr[appropriate_bucket-1].append(i)
    
    for i in bucketArr:
        i = insertionSort(i)
    
    arr = []
    for i in bucketArr:
        arr.extend(i)

    print(arr)

插入排序本身是一个 O(n^2) 操作,外循环上升到元素数量的平方根,即 O(sqrt(n)),所以它应该是 O(log(n) * n^2 )

【问题讨论】:

  • sqrt(n) 不是 O(log(n))。对数的增长比多项式慢得多。

标签: python-3.x sorting data-structures bucket-sort


【解决方案1】:

插入排序本身是一个 O(n^2) 操作,外循环上升到元素数量的平方根,即 O(sqrt(n)),所以它应该是 O(log(n) * n^2 )

你已经给出了一个论点,为什么时间复杂度可能是 O(n2.5),而不是 O(log(n) * n^2),尽管有一个相对简单的原因为什么两者它们不是严格的上限(宽松的上限并没有错,但不太有趣,在某些情况下可能被视为错误)。

项目总数仍然只有n

在最坏的情况下,所有项目都在一个桶中,这就是 O(n²) 时间复杂度的来源。所有其他项目在桶上的分布都更好。桶不能全部都很大,这是你的论点隐含的假设。

这就是为什么“乘以嵌套循环的时间复杂度”的经验法则只是经验法则的一个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多