标题几乎告诉了所有内容,但我将举例说明:假设你有一个字符数组a,另一个数组b也有字符。有没有更好的方法来放入位于b的黄金位置的char?假设我们有一个具有主要位置的数组。 现在我的天真代码看起来像这样。
for(i = 0; i < n; i++)
a[i] = b[j + prime[i]];
这里prime [i]存储b的素数位置b和b远大于a,j是b中的任意位置(不会有出界问题,因为j + prime [i]不超过边界b)。
答案 0 :(得分:0)
当您将数值读取(或复制)到数组中时,可以使用素数函数来告诉您数字是否为素数。
我快速绘制的一种方法是生成素数,直到它们达到阵列容量并简单地遍历它们并从 a 数组中复制所需的元素。我可以想到几种优化方法,例如使用“预处理”功能在程序中生成素数,以便重复使用列表。
素数列表将被缓存,访问时间将会少得多(你不太可能有一个非常庞大的素数列表)
答案 1 :(得分:0)
什么更好?一种方法是:如果prime []位置在编译时已知,那么我们可以添加预取以提前获取缓存行。
这使内存访问时间更好。
答案 2 :(得分:0)
让我们从算法的角度来看待这个问题。
您希望对数组A中的每个条目执行散列函数。假设您对数组A中的项的状态一无所知,那么将算法的运行时的下限置于O(n ),线性时间。您必须遍历每个成员,因为您没有任何其他信息可以帮助您“跳过”某些元素或优化流程。
也就是说,然后挑战就是将算法保持在O(n)。您演示的代码会这样做,假设您接着以相同的方式复制非素数。因此,对于复制步骤,从算法的角度来看,没有办法使其更快。但这并不意味着您执行散列步骤的方式不会影响速度。