Java A[j]=2∗;具有优于O(n^2)运行时的列表中的[i]

Java A[j]=2∗;具有优于O(n^2)运行时的列表中的[i],java,python,arrays,algorithm,big-o,Java,Python,Arrays,Algorithm,Big O,下面我列出了一个我遇到麻烦的问题。这个问题是一个远离O(n^2)解决方案的简单嵌套循环,但我需要它是O(n)。有什么办法解决这个问题吗?有可能形成两个方程式吗 给定一个整数数组A,检查是否有两个索引i和j,使得A[j]=2∗A[我]。例如,在数组(25、13、16、7、8)上,算法应该输出“true”(因为16=2*8),而在数组(25、17、44、24)上,算法应该输出“false”。描述此问题的算法,最坏情况下的运行时间优于O(n^2),其中n是A的长度 谢谢 这是使用哈希表的好地方。创建一

下面我列出了一个我遇到麻烦的问题。这个问题是一个远离O(n^2)解决方案的简单嵌套循环,但我需要它是O(n)。有什么办法解决这个问题吗?有可能形成两个方程式吗

给定一个整数数组A,检查是否有两个索引i和j,使得A[j]=2∗A[我]。例如,在数组(25、13、16、7、8)上,算法应该输出“true”(因为16=2*8),而在数组(25、17、44、24)上,算法应该输出“false”。描述此问题的算法,最坏情况下的运行时间优于O(n^2),其中n是A的长度


谢谢

这是使用哈希表的好地方。创建一个哈希表,并将数组中的每个数字输入哈希表。然后,再次遍历数组,检查哈希表中是否存在每个i的2*A[i]。如果是这样,那么您知道存在一对具有此属性的索引。如果没有,你就知道不存在这样的一对

根据预期,这需要时间O(n),因为哈希表上的n个操作需要预期的摊销O(1)时间


希望这有帮助

templatetypedef关于使用哈希表的建议很好。我想再解释一下原因

这里的关键是要认识到,您实际上是在搜索集合中的某个值。您有一组正在搜索的数字(2*输入数组中的每个值)和一组正在搜索的数字(输入数组中的每个值)。你的暴力幼稚案例只是直接在数组中的搜索中查找值。您要做的是将“search in”集合预加载到比数组(如哈希表)查找更快的内容中,然后您可以从那里进行搜索

您还可以通过不搜索
A[i]
来进一步修剪结果,其中
A[i]
是奇数;因为你知道如果
A[i]
是奇数,
A[i]=2*A[j]
就永远不会是真的。您还可以在初始化期间动态计算“搜索范围”数组中的最小值和最大值,并删除该范围之外的所有
A[i]

那里的性能很难用大O型表示,因为它取决于数据的性质,但您也可以计算最佳和最坏情况以及摊销情况


但是,哈希表大小的正确选择(如果值范围很小,您只需选择一个大于值范围的容量,其中哈希函数就是值本身)实际上可能会使修剪的成本更高。在某些情况下,您必须对其进行分析以找出原因。

为什么要使用哈希表而不是集合?就因为你能?这是考试的练习题。这是(写作方面)最快的方式吗?布景也可以吗?我以前从未实现过哈希表。@MattFenwick Python集是以哈希表的形式实现的。根据Python时间复杂度图,在这种情况下,交集运算是O(len(s)*len(t))或O(n^2)。很遗憾。@MattFenwick-当我写下这个答案时,我注意到这个问题同时用[java]和[Python]标记。我对Python没有太多的经验,我想我会根据适当的底层数据结构给出答案,而不是像集合这样的具体类型,这样我就可以(1)保证跨越语言障碍的时间复杂性,(2)确保我没有意外地犯Python错误。因为Python中的集合看起来是由哈希表支持的,所以在本例中使用集合似乎是合适的。