Arrays 在O(n*log(n))中找到一对具有给定和和和乘积的数组元素

Arrays 在O(n*log(n))中找到一对具有给定和和和乘积的数组元素,arrays,algorithm,integer,Arrays,Algorithm,Integer,设A为n个正整数的数组,k为给定整数 我正在寻找一种算法,以确定数组中是否有一对元素 A[i]*A[j]==k和A[i]==A[j]+k。如果有这样一对,算法应该返回它们的索引 这是一个家庭作业练习,我们被告知有一个O(n*log(n))解决方案。使用nlog(n)进行排序 然后通过数组进行数据传输 对于每个指数,我计算A[j]需要多少才能满足方程 检查数组中是否有这样的值 O(nlogn)+O(N)*O(logn) =O(nlogn)我头上第一件事: Make a Map<Integer

设A为n个正整数的数组,k为给定整数

我正在寻找一种算法,以确定数组中是否有一对元素
A[i]*A[j]==k
A[i]==A[j]+k
。如果有这样一对,算法应该返回它们的索引

这是一个家庭作业练习,我们被告知有一个O(n*log(n))解决方案。

使用nlog(n)进行排序
然后通过数组进行数据传输
对于每个指数,我计算A[j]需要多少才能满足方程
检查数组中是否有这样的值

O(nlogn)+O(N)*O(logn)

=O(nlogn)

我头上第一件事:

Make a Map<Integer, Integer>

for each number a in A:
   if (k / a) is a key in the HashMap:
      output the index of a, and HashMap.get(k/a)
   else
      HashMap.add(a, indexof(a))
制作地图
对于a中的每个数字a:
如果(k/a)是HashMap中的一个键:
输出a的索引和HashMap.get(k/a)
其他的
add(a,indexof(a))
因此,O(n)遍历数组,O(logn)在映射中查找键(假设使用树映射,HashMap在最好的情况下可能更好,但在最坏的情况下可能更糟)


编辑:我想这只回答了a)但你明白了

这是努布的解决方案

而且,它更像O(N)(假设哈希不会让我们失败),而不是O(N*log(N))

Result findMultiplicationIndications(int[]A,int[]B,int k)
{
HashMap aDivisors=新HashMap();

对于(inti=0;i如果k是固定的,则有有限多个整数x,y使得x*y=k。 对于每个因子(x,y),遍历列表,查找A[i]=x还是A[i]=y。 总运行时间=O(n)*#k=O(n)的因子(确定性地,而不是关于散列的假设)


问题是A[i]都是正的,所以k也可以用有限的多种方式分解x+y=k,所以O(n)也是如此。

你没有说二元搜索!该死,我想当然地认为排序列表是二元搜索的。我们两个都有点:)我相信我们会得到A,但现在这个问题对他的同学来说是可以解决的,所以曲线会让他得到!@bbudge:我会告诉你怎么做。最有经验的用户会意识到为某人做作业会适得其反,他们宁愿提供指导,而不给出解决方案,这样海报就可以自己学习了。@danben:好了仍然有许多人会利用问题来提高自己的技能,并在时间允许的情况下解决任何他们觉得有趣的问题。Jean-Bernard Pellerin首先接受了他的答案以及图形Noob(毕竟不是Noob:?)为了获得更多的效果运行时间感谢很多人这个论坛真的很棒…Rotor感谢你的努力…想知道为什么没有人不建议使用heap:)@gleb pendler可能是因为在我们的例子中,heap和排序数组基本上是一样的?heap有利于动态添加项目,否则它只是排序。现在应该可以了。丑陋的though、 需要9行代码来处理这样一个简单的情况(k==0),还有一件事需要注意:映射中的最大元素数等于k的最大值,即O(k^log(2)^(1/log(log(k)))内存,31位整数等于1600。平均除数的渐近公式变得更简单——它就是log(k)。
Make a Map<Integer, Integer>

for each number a in A:
   if (k / a) is a key in the HashMap:
      output the index of a, and HashMap.get(k/a)
   else
      HashMap.add(a, indexof(a))
Result findMultiplicationIndices(int[] A, int[] B, int k)
{
    HashMap<Integer,Integer> aDivisors = new HashMap<Integer,Integer>();
    for(int i=0;i<A.length;i++)
    {
        int a = A[i];
        if(a!=0)
        {
            int d = k/a;
            if(d*a == k) 
                aDivisors.put(d, i);
        }
    }
    for(int i=0;i<B.length;i++)
    {
        Integer ai = aDivisors.get(B[i]);
        if(ai != null)
            return new Result(ai, i);
    }
    return null;
}