对于数组 s,如何使用 Si<sj 计算 O(1) 中任何给定 i 的对数

how to count number of pairs with si<sj for any given i in O(1) for array s

本文关键字:计算 任何 sj lt 数组 于数组 Si 何使用      更新时间:2023-10-16
for(int k=0; k<n-1 ; k++)
{
for(int l=k+1; l<n; l++)
{
if(s[k]<s[l])
count = count+1;
}
}

此代码具有O(n²(复杂性。如何改进?

如果保证数组中的所有元素都是唯一的,那么这非常简单。s[i] < s[j]将成为第(n-1(个三角形数的s[i]-s[j]对的数量,其中n是阵列中的元素数量。请参阅以下元素{0, 1, 2, 3}的简单表格。行指定s[i],列指定s[j]

0   1   2   3
0  =   <   <   <
1  >   =   <   <
2  >   >   =   <
3  >   >   >   =

我们正在寻找s[i]小于s[j]的数字——正如你所看到的,这是表的右上角三角形。只要所有元素都是唯一的,这将始终是真的。

要计算三角形数,它是(n - 1) * n / 2

使用快速排序算法维基百科

每次使用枢轴进行分离时,您都可以根据两个部分的大小来计算成对的数量。

一方的每个值与另一方的各个值成对,换句话说,它是p*(n - p),其中n是表的大小,p是枢轴的位置。

每次发生分离时求和该值。

示例:

[ 1, 5, 3, 2, 4, 4, 1,  9, 7, 9, 8 ]
-------------------   ----------
(p)         *   (n - p)
相关文章: