谁能告诉我这个问题的更好解决方案?我只能想到暴力方式是O(n ^ 2)

德布·希诺比

最近,我正在尝试以下问题:

Given an array of integers, arr. 
Find sum of floor of (arr[i]/arr[j]) for all pairs of indices (i,j).

例如

Input: arr[]={1,2,3,4,5} 
Output: Sum=27.

说明:

(1/1)+(1/5)+(1/4)+(1/2)+(1/3) = 1+0+0+0+0 = 1

(5/1)+(5/5)+(5/4)+(5/2)+(5/3) = 5+1+1+2+1 = 10

(4/1)+(4/5)+(4/4)+(4/2)+(4/3) = 4+0+1+2+1 = 8

(2/1)+(2/5)+(2/4)+(2/2)+(2/3) = 2+0+0+1+0 = 3

(3/1)+(3/5)+(3/4)+(3/2)+(3/3) = 3+0+0+1+1 = 5

我只能想到天真的O(n ^ 2)解决方案。还有其他更好的方法吗?

提前致谢。

伊夫·达乌斯特(Yves Daoust)

一种可能性是“快速”跳过与给定元素相同整数倍的元素(四舍五入后)。

对于给定的示例,下面的竖线以相等的比率定界游程(下部三角形全为零,被忽略;我在左边显示元素,在右边显示比率):

1 -> 2 | 3 | 4 | 5 ≡ 2 | 3 | 4 | 5
2 ->     3 | 4   5 ≡     1 | 2   2
3 ->         4   5 ≡         1   1
4 ->             5 ≡             1

对于更大的数组,恒定运行时间可能更长。

所以算法原理是

  • 逐步对所有要素进行分类;

  • 从最小到最大处理元素;

    • 对于给定的元素,找到第一个double的索引并计算跳过的元素的数量;
    • 从那里,找到第一个三元组的索引,并计算跳过元素的数量的两倍;
    • 以更高的倍数继续,直到用尽数组的尾部。

一项关键操作是“找到下一个倍数”。这应该通过指数搜索后再进行二分搜索来完成,这样操作的数量就可以跳过的元素数量保持对数(纯二分搜索将成为剩余元素总数的对数)。因此,搜索成本将与倍数之间距离的对数之和成正比。

希望该总和小于距离本身的总和,尽管在最坏的情况下复杂度仍然存在O(N)在最佳情况下,O(log(N))

全局分析是困难的,理论上最坏的情况仍然存在O(N²)但实际上,它可以归结为O(N log N),因为最坏的情况将要求元素的生长速度快于共同比率2的几何级数。


附录:

如果数组包含大量重复值,则可以通过存储重复计数和每个值的单个实例来压缩它。可以在排序后完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是我的解决方案O(n ^ 2),如果是,为什么它以与O(n)解决方案相同的速度运行

LeetCode 1365-寻找比O(n ^ 2)更好的解决方案

谁能告诉我为什么这超过了 2 秒的时间限制?(短代码)

我有问题,但在 2 天内找不到解决方案 Laravel 电子邮件

我在 C++ 中对 Project Euler 的 #2 的解决方案有什么问题?

谁能告诉我这个密码的名称?

最长回文子串问题 - O(N^2 logN) 解决方案 - 二分搜索

猜数字游戏。field2不显示任何内容。谁能告诉我这是怎么回事?

河内塔解决方案比O(2 ^ n)好吗?

为什么我的问题 2(项目 euler)的 JavaScript 解决方案在控制台上显示无穷大?

我找不到计算器的解决方案,我的代码0×2 = 2或0/2 = 2

我想更新数据库中的 50000 条记录,需要 2 分钟,有人有更好的解决方案吗?

谁能告诉我这个对话框出了什么问题?

谁能告诉我这个CSS代码有什么问题吗?

谁能告诉我这个递归函数出了什么问题?

谁能告诉我这个符号是什么

谁能告诉我这个 javascript 等价物

谁能告诉我我的代码出了什么问题

谁能告诉我我的功能出了什么问题?

谁能告诉我这是怎么回事?图层conv2d_21的输入0与图层不兼容:输入形状的预期轴-1的值为1

谁能告诉我该语法的调用方式及其作用?

指针关于 C 练习 6.18-2,我的解决方案不起作用

我怎样才能解决这个问题?它告诉我可选的“!” 不需要

leetcode 上的字符串 a 到 i 问题我的解决方案在出现 2 个连续符号的情况下失败

Leetcode轻松链接列表问题:为什么我的解决方案有误?(21.合并2个排序的列表)

我的网页没有针对此CSS代码上下移动?谁能告诉我这个问题?

我完全被这个python编程练习难住了,谁能告诉我出了什么问题?

我尝试了多种方法,谁能告诉我这个数组有什么问题?

谁能帮我解决这个设计问题?