给定一个数组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)
rangeQuery
,O(log n)
。总体时间复杂度为O(nlogn*2*logn),是渐近的O(nlogn)。
这种方法正确吗?是否有可能制定线性时间解决方案?我尝试使用哈希图,但发现很难得出线性解决方案。
这似乎有点强迫“线性”的定义。我会用另一种方式。我们可以注意到函数距离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");
}
我想到了这个:
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²)。我对线性算法是否存在感兴趣
就一般情况而言,你的想法似乎很有效。
对于元素都是整数的情况,可以在Θ(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)。 找到每个子树的最大深度(尽可能多的子树,因为有根节点的子节点)。 将每个子树的最大深度存储在中,对其进行排序并打印最后两个值的总和。 有人能指出我程序中的错误吗?