Tag:

O(log N)== O(1) – 为什么不呢?

每当我考虑algorithm/数据结构,我倾向于用常量来replacelog(N)部分。 哦,我知道日志(N)分歧 – 但在真实世界的应用程序中是否重要? 日志(无穷远)<100为实际目的。 我真的很好奇现实世界的例子,这不成立。 澄清: 我明白O(f(N)) 我很好奇真实世界的例子, 渐近行为比实际performance的常量更重要。 如果log(N)可以被一个常量替代,它仍然可以用O(N log N)中的一个常量代替。 这个问题是为了(a)娱乐和(b)收集争论的使用,如果我再次(关于devise的performance)的争议。

这个algorithm的大O分析是什么?

我正在研究一个数据结构课程,我不确定如何进行这个大O分析: sum = 0; for(i = 1; i < n; i++) for(j = 1; j < i*i; j++) if(j % i == 0) for(k = 0; k < j; k++) sum++; 我最初的想法是,这是减less后的O(n ^ 3),因为最里面的循环只会在j / i没有余数时运行,而乘法规则不适用。 我的推理在这里是正确的吗?

检测一个string是否有独特的字符:比较我的解决scheme“破解编码面试?”

我正在通过“破解编码采访”一书的工作,我在这里遇到问题要求答案,但我需要帮助比较我的答案和解决scheme。 我的algorithm可行,但我很难理解本书中的解决scheme。 主要是因为我不明白一些运营商在做什么。 任务是:“实现一个algorithm来确定一个string是否具有所有唯一的字符,如果不能使用额外的数据结构怎么办? 这是我的解决scheme: public static boolean checkForUnique(String str){ boolean containsUnique = false; for(char c : str.toCharArray()){ if(str.indexOf(c) == str.lastIndexOf(c)){ containsUnique = true; } else { containsUnique = false; } } return containsUnique; } 它有效,但这有多高效? 我看到Java中的String的索引函数的复杂性是O(n * m) 以下是本书的解决scheme: public static boolean isUniqueChars(String str) { if (str.length() > 256) { return false; } int […]

2 ^ n和n * 2 ^ n在相同的时间复杂度?

我在时间复杂性上find的资源并不清楚什么时候可以忽略时间复杂度方程中的项,特别是非多项式的例子。 我很清楚,给定n 2 + n + 1的forms,后两项是不重要的。 具体来说,给出两个分类,2 n和n *(2 n )是第二个与第一个相同的顺序? 那么附加的n乘法是否重要? 通常资源只是说x n处于指数增长速度更快,然后继续前进。 我可以理解为什么它不会因为n会大大超出n,而是因为它们没有被加在一起,所以在比较两个方程的时候会有很大的关系,实际上它们之间的差别总是n的一个因子,这至less可以说是很重要的。

为什么O(n ^ 2)这个algorithm的大O复杂性?

我知道这个algorithm的大O复杂度是O(n^2) ,但我不明白为什么。 int sum = 0; int i = 1; j = n * n; while (i++ < j–) sum++; 即使我们在开始时设置j = n * n ,我们在每次迭代期间递增i和递减j,所以迭代的结果数量是不是应该比n*nless很多?

什么是假多项时间? 它与多项式时间有什么不同?

什么是假多项时间 ? 它与多项式时间有什么不同? 在假多项式时间运行的一些algorithm具有如O(nW)(对于0/1背包问题 )或O(√n)(用于试划分 )的运行时间; 为什么不算多项式时间呢?

JavaScript数组的大O

JavaScript中的数组非常容易通过添加和删除项目进行修改。 它有点掩盖了大多数语言数组是固定大小的事实,并且需要复杂的操作来resize。 JavaScript似乎很容易编写性能不佳的数组代码。 这导致了一个问题: 在数组性能方面,我可以从JavaScript实现中期望什么样的性能(就大O时间复杂度而言)? 我认为所有合理的JavaScript实现至less有以下大O. 访问 – O(1) 附加 – O(n) 预先计划 – O(n) 插入 – O(n) 删除 – O(n) 交换 – O(1) JavaScript允许使用new Array(length)语法将数组预先填充到特定的大小。 (奖金问题:以这种方式创build一个数组O(1)或O(n))这更像是一个常规的数组,如果用作预先大小的数组,可以允许O(1)追加。 如果添加了循环缓冲区逻辑,则可以实现O(1)预先计划。 如果使用dynamic扩展的数组,O(log n)将是这两者的平均情况。 我能期待比我的假设更好的performance吗? 我不希望在任何规范中列出任何内容,但实际上可能是所有主要实现都在后台使用优化的数组。 是否有dynamic扩展数组或其他性能提升algorithm在工作? PS 我想知道这个的原因是因为我正在研究一些sortingalgorithm,其中大部分似乎假定追加和删除O(1)操作时,描述他们的整体大O.

什么会导致algorithm具有O(log n)的复杂性?

我对big-O的认识是有限的,当log方程出现在方程中的时候,它会把我抛到更远的地方。 有人可以简单地向我解释一下O(log n)algorithm是什么? 对数从哪里来? 当我试图解决这个中期实践问题时,这是特别提出的: 让X(1..n)和Y(1..n)包含两个整数列表,每个列表按非递减顺序sorting。 给出一个O(log n)时间algorithm来查找所有2n组合元素的中值(或第n个最小整数)。 例如,X =(4,5,7,8,9)和Y =(3,5,8,9,10),则7是组合列表的中间值(3,4,5,5,7 ,8,8,9,9,10)。 [提示:使用二进制search的概念]

最大单一销售利润

假设我们在一天内得到一个n个整数代表股票价格。 我们希望find一个(buyDay,sellDay) , buyDay≤sellDay ,这样如果我们在buyDay买入股票并在卖出date卖出 ,我们将最大化我们的利润。 很明显,通过尝试所有可能的(buyDay,sellDay)对,并从所有这些对中最好地解决algorithm的O(n 2 )解决scheme。 然而,有没有更好的algorithm,也许是一个运行在O(n)时间?

有没有什么情况下,你更喜欢更高的大O时间复杂度algorithm而不是更低的?

是否有任何情况下你会更喜欢O(log n)时间复杂度到O(1)时间复杂度? 或者O(n)到O(log n) ? 你有什么例子吗?