Big-O表示法的替代方案?

时间:2012-04-25 17:54:07

标签: language-agnostic data-structures big-o

下午好,

我们说hashtable有O(1)查找(假设我们有密钥),而linked list有O(1)查找下一个节点(前提是我们有一个引用当前节点。)

但是,由于Big-O notation的工作原理,它在表达(或区分)算法 x 的成本与算法成本的成本方面并不十分有用x + m

例如,即使我们将哈希表的查找和链表的查找标记为O(1),这两个O(1)也可以归结为非常不同的步骤数,

链接列表的查找固定为 x 步数。但是,哈希表的查找是变量。散列表查找的成本取决于散列函数的成本,因此散列表查找所需的步骤数为: x + m

  1. 其中 x 是固定数字

  2. m 是未知的变量

  3. 换句话说,即使我们同时调用操作O(1),哈希表的查找成本也比链表的成本高幅度查找。

    Big-O表示法具体是关于输入数据集合的大小。这确实有它的优点,但它也有它的缺点,当我们崩溃并将所有非 n 变量归一化为1时可以看出。我们看不到里面的m变量(散列函数)它了

    除了Big-O表示法之外,还有另一个(已建立)表示法,我们可以用来表达固定成本O(1),这意味着 x 操作和变量成本O(1)表示 x + m m ,散列函数)操作次数?

3 个答案:

答案 0 :(得分:2)

  

字面值O(1)表示正好1次操作

除非没有。大O-Notation涉及与输入相关的复杂性的相对比较。如果算法确实采取了一定数量的步骤,完全独立于输入的大小,那么确切的步数并不重要。

看一下O(n)的(非正式)定义:

informal definition of big O

这意味着:有一定的k因此,对于每个n,函数f小于函数g

在上面的例子中,哈希表查找和链表查找将是f,而g将是g(n) = 1。对于每种情况,您都可以找到k的{​​{1}}。

现在,这个f(n) <= g(n) * k不需要修复,它可能因平台,实现,特定硬件而异。唯一有趣的一点是它存在。这就是为什么哈希表查找和链表节点查找都是O(1):无论输入如何,两者都具有恒定的复杂性。在评估算法时,这就是有趣的,而不是物理步骤。

特别关于Hashtable查找

是的,哈希函数确实需要进行多种操作(取决于实现)。但是,根据输入的大小,它不需要可变的操作量。 Big O-Nation特别关于输入数据集合的大小。哈希函数采用单个元素。对于算法的评估,某个函数需要10,20,50或100次操作无关紧要,如果操作次数没有随输入大小增加,则为O(1)。没有办法在大O-Notation中区分它,因为这不是大O-Notation的意思。

答案 1 :(得分:1)

问题是“操作次数”高度依赖于上下文。事实上,这就是为什么发明了大O符号的原因 - 它似乎在为大量计算机建模时效果很好。

此外,程序员所谓的“操作”的数量并不意味着它实际需要花费多少时间(例如它是否已经在缓存中?)或硬件实际需要多少步骤(处理器做什么 - 确切地说 - 它有微操作吗?)甚至有多少操作都是由处理器决定的(你的编译器为你做了什么?)。即使你试图定义一个足够抽象的精确概念,这些都是关注点。

因此。就目前而言,它是Big-O与“运营” - 无论“操作”对您和您的同事意味着什么。

答案 2 :(得分:1)

“〜”包括常数因子 - 请参阅the family of bachmann functions