Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 数据结构-检查数组是否包含两个整数,第一个整数比第二个整数大2倍_Algorithm_Data Structures_Time Complexity - Fatal编程技术网

Algorithm 数据结构-检查数组是否包含两个整数,第一个整数比第二个整数大2倍

Algorithm 数据结构-检查数组是否包含两个整数,第一个整数比第二个整数大2倍,algorithm,data-structures,time-complexity,Algorithm,Data Structures,Time Complexity,我想知道是否有办法检查数组是否包含2个整数(整数>0),第一个整数正好是第二个整数的2倍 e、 g: 2和4应该返回true 在时间复杂度为O(n)的情况下,我怎么做 散列每个整数。对于每个整数x,检查哈希表中是否有2*x。对于散列,这是O(n),对于每个检查,这是O(1),因此总的复杂度是O(n)。散列每个整数。对于每个整数x,检查哈希表中是否有2*x。散列运算是O(n),每次检查是O(1),因此总的复杂度是O(n)。您可以使用O(2^m)内存在O(n)时间内完成此操作,其中m是每个输入元素的

我想知道是否有办法检查数组是否包含2个整数(整数>0),第一个整数正好是第二个整数的2倍

e、 g:

2和4应该返回true


在时间复杂度为O(n)的情况下,我怎么做

散列每个整数。对于每个整数x,检查哈希表中是否有2*x。对于散列,这是O(n),对于每个检查,这是O(1),因此总的复杂度是O(n)。

散列每个整数。对于每个整数x,检查哈希表中是否有2*x。散列运算是O(n),每次检查是O(1),因此总的复杂度是O(n)。

您可以使用O(2^m)内存在O(n)时间内完成此操作,其中m是每个输入元素的位数

假设输入元素是m位整数(其范围为0..(2^m)-1):

一次性解决方案:

  • 定义大小为2^m位(=2^(m-3)字节)的数组:
  • 零阵列a
  • 对于每个源元素e:
    • 如果e是偶数
      • 如果[e/2]==1,则找到
    • 如果e<2^(m-1)
      • 如果[e*2]==1,则找到
    • 设置a[e]=1
提高内存需求:

  • 不需要存储任何奇数整数e>2^(m-1),因为e/2和e*2都是不可行的。这样可以节省25%
  • 两遍解决方案:第一遍只存储偶数整数,第二遍搜索2*e。这样可以节省50%

哈希表将为您提供O(n)摊销(不是最坏情况),并且仅当输入集很小时才需要较少的内存(您需要自己存储值,使用大表避免频繁冲突,管理列表等)。

您可以使用O(2^m)内存在O(n)时间内完成此操作,其中m是每个输入元素的位数

假设输入元素是m位整数(其范围为0..(2^m)-1):

一次性解决方案:

  • 定义大小为2^m位(=2^(m-3)字节)的数组:
  • 零阵列a
  • 对于每个源元素e:
    • 如果e是偶数
      • 如果[e/2]==1,则找到
    • 如果e<2^(m-1)
      • 如果[e*2]==1,则找到
    • 设置a[e]=1
提高内存需求:

  • 不需要存储任何奇数整数e>2^(m-1),因为e/2和e*2都是不可行的。这样可以节省25%
  • 两遍解决方案:第一遍只存储偶数整数,第二遍搜索2*e。这样可以节省50%


哈希表将为您提供O(n)摊销(不是最坏情况),并且仅当输入集很小时才需要较少的内存(您需要自己存储值,使用大表避免频繁冲突,管理列表等)

谢谢您的回答。但是当我检查每个x时,如果2*x在哈希表中,时间复杂度是O(n^2)否?否。对于每个x,检查2*x是否在哈希表中是一个常数时间操作。你检查n个数字,所以总数是O(n)。@试图了解你正在通过数组进行两次线性传递,所以所花费的时间仍然是O(n),尽管比通过数组进行一次传递要差一些。您可以将此答案的各个方面(使用哈希表)与Lior答案的各个方面(同时检查/2和*2)结合起来,得出一个相当简单且性能良好的单遍解决方案。谢谢您的回答。但是当我检查每个x时,如果2*x在哈希表中,时间复杂度是O(n^2)否?否。对于每个x,检查2*x是否在哈希表中是一个常数时间操作。你检查n个数字,所以总数是O(n)。@试图了解你正在通过数组进行两次线性传递,所以所花费的时间仍然是O(n),尽管比通过数组进行一次传递要差一些。您可以将此答案的各个方面(使用哈希表)与Lior答案的各个方面(检查/2和*2)结合起来,得出一个相当简单且性能良好的单遍解决方案。这真的是
O(n)
内存吗?数组的大小以及使用的内存将取决于最大数字的大小,不是吗?我可以想象内存使用是
m
的一个功能。这是一个经过仔细考虑和性能良好的答案,但也许可以做得更好一些。因为我们只对2的幂感兴趣,也许可以通过日志将缓存索引到e的基数2(即数字的2的幂)。然后,您可以检查是否存在[log_2(e)+1]或[log_2(e)-1],如果找到,则返回true。这将是记忆中的O(m)@Asad:为什么我们只关注2的幂?谢谢你的回答,先生。托达·拉巴;)@这真的是
O(n)
内存吗?数组的大小以及使用的内存将取决于最大数字的大小,不是吗?我可以想象内存使用是
m
的一个功能。这是一个经过仔细考虑和性能良好的答案,但也许可以做得更好一些。因为我们只对2的幂感兴趣,也许可以通过日志将缓存索引到e的基数2(即数字的2的幂)。然后,您可以检查是否存在[log_2(e)+1]或[log_2(e)-1],如果找到,则返回true。这将是记忆中的O(m)@Asad:为什么我们只关注2的幂?谢谢你的回答,先生。托达·拉巴;)@利奥科甘
44 6 2 5 9 22 5 3 4 31