对于数组 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
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)
相关文章:
- 计算单词中的音节数,但考虑到单词中彼此相邻的任何元音都算作一个音节
- 对于数组 s,如何使用 Si<sj 计算 O(1) 中任何给定 i 的对数
- 在W10下为NVidia使用VS2019构建计算cpp-sdk的任何特殊步骤
- GLSL 计算着色器 使用查找表设置缓冲区会导致不写入任何数据,与其他数据设置相同的缓冲区有效
- 我可以在计算数据计划上修复该C 程序的任何建议吗?
- C++ std::string 中是否有任何函数可以计算两个字符串的相同起始字符的总数或任何最佳方法
- 如何计算该程序的复杂性?是否有任何其他复杂性较低的解决方案
- 浮点计算可以用于任何可靠的函数,特别是容器和算法吗?
- 是否有任何数据类型或方法可以计算当前单元格中先前数组单元格的总和
- 如何在任何使用 Opencv 的计算机上显示图像
- 只需一个函数即可为不同类型的变量进行相同计算的任何方法
- 如何使用字符串或字符载体(分别包含任何化学成分式)并计算其摩尔质量?
- 是否有任何合理的场景,程序员可能希望避免布尔表达式的短路计算
- 像儒略数字用于计算日期一样,是否有任何特定的数字来计算时间
- 创建不需要任何进一步安装即可在其他计算机上工作的可执行文件?
- 使用OpenCV教程中的任何一个进行人脸检测是否有任何函数可以计算绘制在人脸上的矩形的大小
- 如何在任何Windows计算机上运行.exe文件
- 编写一个模板函数,用于计算具有任何返回类型的 lambda 函数
- 任何比 pow() 更快的方法都可以在 C++ 中计算 10 的整数幂
- 以给定的年复利计算任何金额翻倍的时间