【问题标题】:Skolem sequence generator algorithmSkolem 序列生成器算法
【发布时间】:2017-05-17 22:40:29
【问题描述】:

我的老师要我写一个函数,它得到一个整数值 N 并返回长度为 2n 的数组,并包含该值的 skolem 序列。

例如:function(4) 将返回 {4,2,3,2,4,3,1,1}

我不知道该怎么做。

【问题讨论】:

    标签: algorithm function


    【解决方案1】:

    数字 n 的 Skolem 序列是大小为 2×n 的整数序列,满足两个标准:

    1. 对于每个非负数k n,恰好存在两个元素si sj 的顺序使得 si = sj = k

      李>
    2. 如果 si = sj = ki j 然后 j-i = k

    http://mathworld.wolfram.com/SkolemSequence.html

    基本上,这意味着您需要创建一个数字从 1 到 n 的序列,其中每个数字出现两次。要将序列转换为 skolem 序列,两个 1 必须彼此相邻,两个 2 之间必须有一个数字,3 之间必须有 2 个数字,依此类推。

    这种算法比人们想象的要难创建。最简单的方法是检查序列的每个排列,并返回第一个有效的排列。这是(2n)!复杂性,这非常慢。这是一个没有 n 的算法的参考!复杂: http://www.cs.mun.ca/~dchurchill/pdf/honours.pdf

    我用 C++ 编写了简单的算法。这将为任何给定的输入生成 Skolem 序列。这个算法非常慢,但我希望你明白这一点:

    #include<iostream>
    #include<vector>
    #include<algorithm>
    void start(int num, std::vector<int>& v) { //creates the |2n| sequence
            for(int i = 1; i<=num; i++) {
                    v.push_back(i);
                    v.push_back(i);
            }
    }
    bool check(std::vector<int>& v) { //checks to see if sequence is a skolem sequence
            for(int i = 1; i<=v.size()/2; i++) {
                    auto j = std::find(v.begin(), v.end(), i);
                    auto k = std::find(j+1, v.end(), i);
                    if(k-j != i) {
                            return false;
                    }
            }
            return true;
    }
    void skolem(int num, std::vector<int>& v) { //permutes the vector to find skolem sequences
            start(num, v);
            while(std::next_permutation(v.begin(), v.end())){
                    if(check(v))
                            break;
            }
    }
    int main()
    {
            int num;
            std::cin>>num;
            std::vector<int> v;
            skolem(num, v);
            std::cout<<"found it"<<std::endl;
            print(v);
    }
    

    此算法仅适用于小数字(小于 10)。如果您需要处理更大的序列,我建议您查看上面的链接。

    【讨论】:

    • 其实是(2n!)/2^n,还是一个很大的数,但比2n!小很多。将其减少到 n 真的很容易!这对于 n=12 应该是实用的。
    • 谢谢。但我已经看到了那个链接,我在第二个代码中失去了他。我不明白他添加到函数中的新变量是什么以及他对他做了什么。
    • @spaider11 我认为这里的问题是这似乎更像是一个研究问题而不是家庭作业问题。
    猜你喜欢
    • 1970-01-01
    • 2022-11-05
    • 2014-01-11
    • 2014-03-17
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2012-01-05
    相关资源
    最近更新 更多