big-o - 关于try和基数排序的效率

标签 big-o time-complexity trie radix-sort

基数排序的时间复杂度为 O(kn),其中 n 是要排序的键的数量,k 是键的长度。同样,在 trie 中插入、删除和查找操作的时间复杂度是 O(k)。但是,假设所有元素都是不同的,不是 k>=log(n) 吗?如果是这样,那就意味着基数排序的渐近时间复杂度是 O(nlogn),等于快速排序的时间复杂度,而 trie 运算的时间复杂度是 O(logn),等于平衡二叉搜索树的时间复杂度。当然,常数因子可能会有很大差异,但渐近时间复杂度不会。这是真的吗?如果是的话,与其他算法和数据结构相比,基数排序和尝试是否具有其他优势?

编辑:

Quicksort 及其竞争对手执行 O(nlogn) 次比较;在最坏的情况下,每次比较都将花费 O(k) 时间( key 仅在最后检查的数字处不同)。因此,这些算法需要 O(knlogn) 时间。按照同样的逻辑,平衡二叉搜索树操作需要 O(klogn) 时间。

最佳答案

Big O notation 不是那样使用的,即使 k>=log n 用于基数排序,O(kn) 意味着如果 n 加倍,你的处理时间将加倍等等,这就是你应该如何使用 big-o符号。

基数排序的一个优点是它的最坏情况是 O(kn)(快速排序的 O(n^2)),因此基数排序在某种程度上比快速排序更能抵抗恶意输入。它在实际性能方面也可以非常快,如果您使用按位运算,以 2 的幂为基础,并使用插入排序对较小的数组进行就地 msd-radix 排序。

相同的论点对尝试有效,它们可以抵抗恶意输入,因为插入/搜索在最坏的情况下是 O(k)。哈希表在 O(1) 中执行插入/搜索,但使用 O(k) 哈希,在最坏的情况下 O(N) 插入/搜索。此外,尝试可以更有效地存储字符串。

检查 Algorithmic Complexity Attacks

关于big-o - 关于try和基数排序的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891054/

相关文章:

java - trie 实现中的空间差异

Java执行字符串startsWith的最佳方法

algorithm - 算法导论第三版-习题2.3 -3-nlg(n)的归纳证明

算法 |将 O(N^2) 的复杂性解决为更小的东西?

algorithm - Bailey–Borwein–Plouffe 算法的大 O 符号是什么(Pi 的第 n 个十六进制数字)?

java - HashMap put() api 时间复杂度

algorithm - 这个算法的复杂度是多少,我可以把它加到无穷大吗?

algorithm - 删除链表中的第10000个节点