首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >collatz序列优化代码

collatz序列优化代码
EN

Stack Overflow用户
提问于 2014-10-19 20:10:29
回答 1查看 812关注 0票数 6

作为作业的附加问题,我们被要求找到产生最长collatz序列的10个起始数(n)。(0

我注意到了一些小的优化,比如从最大到最小开始,这样添加到数组中的工作就更少了,只计算10,000,000/2^10 (=9765625)到10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,有人能帮忙吗?

相关编码序列搜索Alg

代码语言:javascript
复制
long[][] longest = new long[2][10]; //terms/starting number
long max = 10000000000l; //10 billion

for(long i = max; i >= 9765625; i--) {
    long n = i;
    long count = 1; //terms in the sequence

    while(n > 1) {
        if((n & 1) == 0) n /= 2; //checks if the last bit is a 0
        else {
            n = (3*n + 1)/2;
            count++;
        }
        count++;
    }
    if(count > longest[0][9]) {
        longest = addToArray(count, i, longest);
        currentBest(longest); //prints the currently stored top 10
    }
}

储藏室alg

代码语言:javascript
复制
public static long[][] addToArray(long count, long i, long[][] longest) {
    int pos = 0;
    while(count < longest[0][pos]) {
        pos++;
    }
    long TEMP = count; //terms
    long TEMPb = i; //starting number
    for(int a = pos; a < longest[0].length; a++) {
        long TEMP2 = longest[0][a];
        longest[0][a] = TEMP;
        TEMP = TEMP2;

        long TEMP2b = longest[1][a];
        longest[1][a] = TEMPb;
        TEMPb = TEMP2b;
    }
    return longest;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-19 21:03:22

你可以做这样的事

代码语言:javascript
复制
while (true) {
    int ntz = Long.numberOfTrailingZeros(n);
    count += ntz;
    n >>>= ntz; // Using unsigned shift allows to work with bigger numbers.
    if (n==1) break;
    n = 3*n + 1;
    count++;
}

它应该更快,因为它同时执行多个步骤,并避免不可预测的分支。numberOfTrailingZeros是JVM内在的,在现代桌面CPU上只需要一个周期。但是,它并不是很有效,因为平均零的数量只有2。

维基百科解释了如何一次执行多个步骤。这是基于这样一种观察,即知道k最不重要的位足以确定将来的步骤,直到k-th减半发生时为止。基于此(使用k=17)和过滤掉一些没有希望的值。,我的最佳结果是57秒,用于确定范围内的最大1 .. 1e10

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26454902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档