码迷,mamicode.com
首页 > 其他好文 > 详细

Kolakoski数列

时间:2018-04-16 18:18:30      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:另一个   分析   nowrap   str   数列   组合   大全   ola   class   

2018-04-16 15:40:16

Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。他在整数数列大全网站上排名第二位,足见该数列在组合数学界中的重要性。

Kolakoski序列的前几项为:1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,… (sequence A000002 in the OEIS)。

如果我们将相同的数字组成一组那么可以得到:

1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,2,2,1,2,2,1,1,2,1,2,2,...
1, 2 , 2 ,1,1, 2 ,1, 2 , 2 ,1, 2 , 2 ,1,1, 2 ,1,1, 2 , 2 ,1, 2 ,1,1, 2 ,1, 2 , 2 ,1,1, 2 ,...

技术分享图片

也就是说Kolakoski序列是一个分形数列:即将数列中相邻的数字以其个数合并,得到的仍将是数列本身。

分析:在Kolakoski数列中1,2是交替出现的,那重要的就是得到当前数出现的次数,当达到出现次数后,将之转成另一个数即可,至于如何获得出现次数,由于Kolakoski是自生成的,所以用一个指针指向当前生成的个数即可。

问题描述:

技术分享图片

问题求解:

    public int magicalString(int n) {
        if (n == 0) return 0;
        if (n <= 3) return 1;
        int[] a = new int[n + 1];
        a[0] = 1;
        a[1] = 2;
        a[2] = 2;
        int head = 2;
        int tail = 3;
        int num = 1;
        int res = 1;
        while (tail < n) {
            for (int i = 0; i < a[head]; i++) {
                a[tail] = num;
                if (num == 1 && tail < n) res++;
                tail++;
            }
            num = num ^ 3;
            head++;
        }
        return res;
    }

 

Kolakoski数列

标签:另一个   分析   nowrap   str   数列   组合   大全   ola   class   

原文地址:https://www.cnblogs.com/TIMHY/p/8856725.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!