【发布时间】:2016-01-09 23:24:33
【问题描述】:
我正在制作一个程序来测试和比较多键顺序搜索和插值二分搜索的统计数据。我在征求意见:
在给定的上下文中,对随机生成的整数数组进行排序,甚至像排序后的数组一样生成它的最佳方法是什么(如果这有意义的话)?
我正在研究一些排序技术,但是,如果您记住重点在于搜索(而不是排序)性能,那么所有高级排序似乎仅用于一种实用程序方法相当复杂。考虑到数组必须大于 106(用于测试目的),修改/冒泡、选择或插入排序不是一个选项。
额外的限制是所有的数组成员必须是唯一的。
现在,我最初的想法是将区间 [INT_MIN,INT_MAX] 分成 n 个区间(n 是数组长度),然后将一个随机整数从 0 到 232/n(向下舍入)添加到每个间隔开始.
问题是这样的:
我认为,随着 n 越来越接近 232,就像我的一样,插值搜索开始提供越来越好的结果,因为它的插值变得更加准确。
但是:
如果我只依赖伪随机数生成器(如rand();),它们的分散特性决定了生成-然后-排序数组的相同趋势,也就是说 - 随着大小接近int 限制,插值在精确定位最可能的位置方面会变得更好。当 n 上升到 INT_MAX 时,均匀性/分散性特征会丢失,因此,由于规定的限制,插值法似乎总是获胜。
如果您认为合适,请随意讨论、批评和澄清这个问题,但我非常渴望得到答案,因为无论哪种方式,测试似乎都受到 Interpolation 的青睐,我想公平地分析它们。简而言之:我想确信我最初的想法不会进一步向有利于插值的方向倾斜,我想使用它,因为它是 O(n) .
【问题讨论】:
-
我不确定我是否正确,您是否想要一种方法来生成排序整数的随机数组,条件是数组很大 (10^6)?对哪些项目应该有任何定义(传播、均匀性......)?
-
@Amit 只是它们是随机的、唯一的和排序的。
-
所以 [1,2,3,6,7,8] 有效吗?
-
所以走吧.. 对于每个元素,将值设置为 a[i-1]+random(x) 其中 random(x) i> 是一个正整数界限,因此它为 ni 个元素留出了足够的空间(应该很容易计算)。
-
我投票决定关闭它,因为它主要是基于意见的(也太面包了),此类问题不适用于本网站。但是,如果“修改/冒泡、选择或插入”是您知道的唯一排序方法,那么您肯定需要更多阅读。
标签: c++ algorithm sorting random linear-interpolation