检查元素是否存在于数组中的算法复杂性

时间:2014-09-06 18:56:53

标签: algorithm complexity-theory computation-theory

如果我有一系列未分类的数字和我正在寻找的数字,我相信除了通过每个成员并进行比较之外,我无法检查我的号码是否在其中。

现在,在我一直感兴趣的数学和各种理论分支中,通常会出现你通常得到的模式。我的意思是,通常会对每个意外结果作出解释。以Monty Hall问题为例。在你意识到主人为这种情况增加更多信息之前,这似乎是违反直觉的,因为他知道这辆车的后门是什么。

由于您正在迭代数组,而不仅仅是获得是或否答案,您还可以获得元素的确切位置(如果它在那里)。难道不是有意义的是,算法不那么复杂,但只给你一点信息吗?

我完全不在这里吗?

您获得的信息量与算法的复杂程度之间是否存在实际关联?您从算法获得的信息量与其复杂性之间的关系背后的理论是什么?

2 个答案:

答案 0 :(得分:4)

是的,你完全偏离基地,对不起!

算法复杂度是根据解决大小N问题所需的操作数来定义的。如果数组中有N个元素,那么无法确定值是否出现在数组中而不是全部检查N个元素。这使它成为线性或O(N)。

你可以 确定O(N)中值的位置(事实上你可以)这并不意味着你可以在更短的时间内解决更简单的问题。

答案 1 :(得分:3)

当您搜索数组时,索引是您为拥有数组而支付的价格。通过索引访问元素的能力是数组结构中固有的:换句话说,一旦你说“我要搜索一个数组”(不是一个集合,而是一个数组),你已经为索引付费了。此时,没有办法摆脱它,以及与搜索数组相关的O(n)成本。

然而,这不是唯一的解决方案:如果您同意放弃索引作为一项要求的能力,您可以构建一个集合,以更快的速度为您提供是/否答案。例如,如果您使用哈希表,则搜索时间将变为O(1)。当然,哈希表中没有关联的索引:无法以任意顺序访问项目是您支付能够在固定时间内检查项目是否存在的能力。