O(log n) 与 O(1)
O(log n) vs O(1)
出于实用目的,哈希算法是否比使用 BST 好得多?我不喜欢 hash tables 在幕后发生了很多事情。在实践中,log(n) 比 O(1) 差得多,我应该尽可能避免使用 BST 代替散列 table?
一方面,散列 table 是(渐近地)O(1)(如果你有一个 O(1) 散列算法用于你的数据),但对于偶尔的情况可能是 O(n)写。也就是说,如果你有一个 suitable 哈希算法。并且没有对抗性数据。最坏的情况是,有人会向您提供所有散列到同一个插槽的数据,因此您的读取和写入都变为 O(n)(再次使用 O(1) 散列算法)。
另一方面,对于读取,BST 应为 log(n),对于写入,应为 log(n)(尽管略有变化)。
一般情况下,我会选择使用起来更方便的那个。在特定情况下,我会使用实际数据进行基准测试。
从数学上讲,假设您有一个大小为 2^20
的输入。
要在输入中找到一个元素,无论输入的大小如何,散列都会简单地执行其 O(1) 函数。
一棵平衡树会执行 log(2^20
) = 20 次操作,大约是 20 次。
现在想象一下大小为 2^n
的输入。你更喜欢哪一个?
显然,这是对场景的简单化设想。如果存在重复输入、受限 space、糟糕的哈希函数、糟糕的哈希方法(有许多方法和类型的哈希,如封闭哈希、开放哈希、双重哈希、布谷鸟哈希、 ETC。)。数学上的差异是显而易见的,但由于无法始终保证刚才提到的所有这些事情的完整性,而且现实生活中的输入往往不会像 2^50
那样高,所以有时一棵树可能会更好。显然是平衡树,而不是简单的二叉搜索树,所有操作最多可能需要O(n)的时间。
出于实用目的,哈希算法是否比使用 BST 好得多?我不喜欢 hash tables 在幕后发生了很多事情。在实践中,log(n) 比 O(1) 差得多,我应该尽可能避免使用 BST 代替散列 table?
一方面,散列 table 是(渐近地)O(1)(如果你有一个 O(1) 散列算法用于你的数据),但对于偶尔的情况可能是 O(n)写。也就是说,如果你有一个 suitable 哈希算法。并且没有对抗性数据。最坏的情况是,有人会向您提供所有散列到同一个插槽的数据,因此您的读取和写入都变为 O(n)(再次使用 O(1) 散列算法)。
另一方面,对于读取,BST 应为 log(n),对于写入,应为 log(n)(尽管略有变化)。
一般情况下,我会选择使用起来更方便的那个。在特定情况下,我会使用实际数据进行基准测试。
从数学上讲,假设您有一个大小为 2^20
的输入。
要在输入中找到一个元素,无论输入的大小如何,散列都会简单地执行其 O(1) 函数。
一棵平衡树会执行 log(2^20
) = 20 次操作,大约是 20 次。
现在想象一下大小为 2^n
的输入。你更喜欢哪一个?
显然,这是对场景的简单化设想。如果存在重复输入、受限 space、糟糕的哈希函数、糟糕的哈希方法(有许多方法和类型的哈希,如封闭哈希、开放哈希、双重哈希、布谷鸟哈希、 ETC。)。数学上的差异是显而易见的,但由于无法始终保证刚才提到的所有这些事情的完整性,而且现实生活中的输入往往不会像 2^50
那样高,所以有时一棵树可能会更好。显然是平衡树,而不是简单的二叉搜索树,所有操作最多可能需要O(n)的时间。