当前位置: 首页 > 知识库问答 >
问题:

找出两个相差不超过k的元素之间的最大距离

东郭远航
2023-03-14

给定一个数组arr,求最大abs(i-j),使abs(arr[i]-arr[j])

经过深思熟虑,我想出了以下算法,

1) Create a new array of pair<arr[i], i> (say arrayIndexPairs)
2) Sort this arrayIndexPairs based on the array value (first of pair).
3) Build a segment tree on the index (second of pair) with the arrayIndexPairs so that we can answer range max queries
4) for i <- 0 to n-1
    4.1) rightIndex = Binary search the array values (first of pair) for ceil(arrayIndexPairs[i].first) in the interval [i+1, n-1]
    4.2) int maxIndex = rangeQueryForMax(i+1, rightIndex)
    4.3) result = max(result, maxIndex - i);
return result

对于每个元素的排序,我们进行二进制搜索的复杂性是O(log n),O(log n)rangeQueryO(log n)。总体时间复杂度为O(nlogn*2*logn),是渐近的O(nlogn)。

这种方法正确吗?是否有可能制定线性时间解决方案?我尝试使用哈希图,但发现很难得出线性解决方案。

共有3个答案

缑修齐
2023-03-14

这似乎有点强迫“线性”的定义。我会用另一种方式。我们可以注意到函数距离d正在搜索最大值。因此我们知道有以下组合:-距离对计数

>

  • d=n-1(a[0], a[n-1])1

    d=n-2(a[0],a[n-2]),(a[1],a[n-1])2

    由于我们搜索最大值,因此我们将首先研究最大距离。所以我们有最好的情况O(1),最坏的情况是从1到n-1=(n-1)*(n/2)=O(n2)的总和。平均我期望更好的性能,因为它可以非常有效地实现。
    这里是C实现:

    #include "stdio.h"
    #include "stdlib.h"
    #define ARRAYSIZE 10000
    
    int find_dist(int * result, const int *array, int n,int k )
    {
      int i,j,ti;
      for (i=n-1;i>0;i--)
      { 
         ti=i;       
         for (j=0;ti< n ; j++,ti++)
            if (abs(array[j]-array[ti])<=abs(k))
                {
                    result[0]=j;
                    result[1]=ti;
                    return 1;
                }
       }
    return 0;
    }
    
    int main()
    {
      int array[ARRAYSIZE],result[2],i;
      for (i=0;i<ARRAYSIZE;i++)
        {
            array[i]=rand()%1000;
            //printf("%d ",array[i]);
        }
      if (find_dist(result,array,ARRAYSIZE,3))
        printf ("\n%d %d\n",result[0],result[1]);
      else
        printf ("No items match requirement\n");
     }
    

  • 商飞翮
    2023-03-14

    我想到了这个:

    def find_max_abs(l, k):
        for lenght_of_interval in range(len(l), 1, -1):
            for start_of_interval in range(0, len(l) - lenght_of_interval + 1):
                if abs(l[start_of_interval] - l[start_of_interval + lenght_of_interval - 1]) <= k:
                    return lenght_of_interval - 1
    

    应该可以很好地工作,但它不是线性的(最坏的情况是N²)。我对线性算法是否存在感兴趣

    谢正初
    2023-03-14

    就一般情况而言,你的想法似乎很有效。

    对于元素都是整数的情况,可以在Θ(n k)预期时间内完成。如果k=o(log(n)),则这是一个保存。如果k是一个常数,这在n中是线性的。

    >

  • 将所有元素放置在一个哈希表中,将每个元素e映射到其在数组i中的位置(如果有多个e,则让您放置在哈希表中的每个条目覆盖上一个条目-这无关紧要)。

    对于位置i处的每个元素e,d=-k,-(k-1)。。。0, 1, ... k、 检查哈希表中是否有e d。如果是这样的话,那么就得到了哈希表中的e d的位置,比如j。

    保留在2中找到的最大距离的位置。

  •  类似资料:
    • 我需要找到数组中的一个元素和数组的k个元素的集合之间的距离的最小和,不包括那个索引。 例如: arr = {5,7,4,9} k = 2 min_sum(5)=|5-4||5-7|=3 min_sum(7) = |7-9| |7-5| = 4 min_sum(4) = |4-5| |4-7|= 4 min_sum(9) = |9-7| |9-5|= 6 因此,一个朴素的解决方案是从数组的每个元素中

    • l和r分别是区间的起点和终点。

    • 假设我有一个包含整数的数组。 如何找到大小的子集,使得子集中所有整数对之间的距离,我的意思是它们在最远的距离。 示例:数组和, ,最小距离为10和6之间的<错误的子集: ,最小距离为 ,最小距离为 我想到了一个解决办法: 1) 排序数组2)选择一个[0],现在在数组中查找ceil(a[0])=Y。。。。然后ceil(Y

    • 在一本书(算法导论,但我不记得是哪一章)中,我学到了求解两元素间最大差值问题: 两个元素之间的最大差,使得较大的元素出现在较小的数之后。 查找数组(至少包含一个数字)中和最大的相邻子数组。 例如,给定数组[-2,1,-3,4,-1,2,1,-5,4],相邻子数组[4,-1,2,1]的最大和=6。 为了解决的两元素间最大差异问题,可以将其转化为数组的最大子数组问题: 我在想为什么。

    • 问题内容: 我有计算纯python中相邻元素之间差异的算法: 有什么办法可以用Numpy重写此功能? 问题答案: 有方法: 退货

    • 我试图找到树中两个节点之间的最大距离。这是我的程序: 程序似乎正在运行;但是没有为一些测试用例显示正确的输出。我采取的方法是: 求根节点的子节点数(我一直认为根节点为0)。 找到每个子树的最大深度(尽可能多的子树,因为有根节点的子节点)。 将每个子树的最大深度存储在中,对其进行排序并打印最后两个值的总和。 有人能指出我程序中的错误吗?