谁能告诉我这个问题的更好解决方案?我只能想到暴力方式是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条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

谁能告诉我这个插入语句怎么了?

来自分类Dev

谁能告诉我这个 javascript 等价物

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

如何在我的Web API 2解决方案中发送“禁止”响应?

来自分类Dev

谁能为我建议一个更好的ctags解决方案?

来自分类Dev

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

来自分类Dev

如何解决这个rpy2问题?我需要安装rpy2

来自分类Dev

我收到此错误:-错误:无法在views目录中查找view“ index”,请告诉我解决方案

来自分类Dev

谁能告诉我排序算法的大 O 时间?

来自分类Dev

谁能告诉我为什么我的触发器不按我预期的方式工作?

来自分类Dev

谁能告诉我为什么这个where子句没有给我结果?

来自分类Dev

当我尝试从函数返回 2d 结构时如何解决这个问题

来自分类Dev

谁能告诉我如何实现?

来自分类Dev

谁能告诉我这段代码的作用?

来自分类Dev

在GRUB2菜单中寻求更好的解决方案以限制访问

来自分类Dev

根据另外2个值对DataFrame进行索引的更好解决方案

来自分类Dev

SQL Server - 将行转为列的 2 个表之间连接的更好解决方案

来自分类Dev

我的mysql表结果在2种情况下需要一些解决方案

来自分类Dev

如何将同一解决方案中的2个项目推送到我的Github存储库?

Related 相关文章

  1. 1

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

  2. 2

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

  3. 3

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

  4. 4

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

  5. 5

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

  6. 6

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

  7. 7

    谁能告诉我这个插入语句怎么了?

  8. 8

    谁能告诉我这个 javascript 等价物

  9. 9

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

  10. 10

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

  11. 11

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

  12. 12

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

  13. 13

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

  14. 14

    如何在我的Web API 2解决方案中发送“禁止”响应?

  15. 15

    谁能为我建议一个更好的ctags解决方案?

  16. 16

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

  17. 17

    如何解决这个rpy2问题?我需要安装rpy2

  18. 18

    我收到此错误:-错误:无法在views目录中查找view“ index”,请告诉我解决方案

  19. 19

    谁能告诉我排序算法的大 O 时间?

  20. 20

    谁能告诉我为什么我的触发器不按我预期的方式工作?

  21. 21

    谁能告诉我为什么这个where子句没有给我结果?

  22. 22

    当我尝试从函数返回 2d 结构时如何解决这个问题

  23. 23

    谁能告诉我如何实现?

  24. 24

    谁能告诉我这段代码的作用?

  25. 25

    在GRUB2菜单中寻求更好的解决方案以限制访问

  26. 26

    根据另外2个值对DataFrame进行索引的更好解决方案

  27. 27

    SQL Server - 将行转为列的 2 个表之间连接的更好解决方案

  28. 28

    我的mysql表结果在2种情况下需要一些解决方案

  29. 29

    如何将同一解决方案中的2个项目推送到我的Github存储库?

热门标签

归档