Take every k-th element from the (1 .. n) natural numbers series

前端 未结 4 1025
日久生厌
日久生厌 2020-12-19 06:54

For example, we have series 1, 2, 3, 4, 5. We take every 3 element => 3, 1, 5, 2, 4 (chosen element shouldn\'t remain, we can take while series is not empty). Naive implemen

4条回答
  •  时光取名叫无心
    2020-12-19 07:34

    Below is an implementation of Lei Wang and Xiaodong Wang's (2013) 1 O(n log k) algorithm (very similar to, if not based on, the algorithm by Errol Lloyd, published in 1983). The idea is to divide the original sequence into n/m binary trees of height log k. The algorithm is actually designed for the "feline" Josephus problem, where the participants can have more than one life (listed in the array variable below, global.l).

    I also like the O(1) space algorithms by Knuth, Ahrens, and Kaplansky, (outlined in a master's thesis by Gregory Wilson, California State University, Hayward, 19792), which take a longer time to process, although can be quite fast depending on the parameters.

    Knuth’s algorithm for J(n,d,t) (t is the ith hit), a descending sequence:

    Let x1 = d * t and for k = 2,3,..., 
      let x_k = ⌊(d * x_(k−1) − d * n − 1) / (d − 1)⌋
    
    Then J(n,d,t) = x_p where x_p is the first term in the sequence <= n.
    

    Ahrens’ algorithm for J(n,d,t), an ascending sequence:

    Let a1 = 1 and for k = 2,3,... 
      let a_k = ⌈(n − t + a_(k−1)) * d / (d − 1)⌉ 
    If a_r is the first term in the sequence such that a_r + 1 ≥ d * t + 1 
      then J(n,d,t) = d * t + 1 − a_r.
    

    Kaplansky’s algorithm for J(n,d,t):

    Let Z+ be the set of positive integers and for k =1,2,...,t 
      define a mapping P_k : Z+ → Z+ by P_k(m) = (m+d−1)−(n−k+1)(m−k+d−1)/(n−k+1)
    Then, J(n,d,t) = P1 ◦ P2 ◦···◦Pt(t).
    

    JavaScript code:

    var global = {
      n: 100000,
      k: 123456,
      l: new Array(5).fill(1),
      m: null,
      b: null,
      a: [],
      next: [],
      prev: [],
      i: 0,
      limit: 5,
      r: null,
      t: null
    }
    
    function init(params){
      global.m = Math.pow(2, Math.ceil(Math.log2(params.k)));
      params.b = Math.ceil(params.n / global.m);
          
      for (let i=0; i 1)
        global.l[h-1] = global.l[h-1] - 1;
      else
        kill(i,j,params_r,params_t);
    }
    
    function kill(i,j,params_r,params_t){
      global.a[params_t.t][j] = 0;
      while (j > 0){
        j = Math.floor((j - 1) / 2);
        global.a[params_t.t][j] = global.a[params_t.t][j] - 1;
      }
      if (params_t.t !== global.next[params_t.t]){
        if (global.a[params_t.t][0] + global.a[global.next[params_t.t]][0] === global.m){
          params_r.r = params_r.r + global.a[global.next[params_t.t]][0];
          combine(params_t);
        } else if (global.a[params_t.t][0] + global.a[global.prev[params_t.t]][0] === global.m){
          t = global.prev[params_t.t];
          combine(params_t);
        }
      }
    }
    
    function combine(params_t){
      let x = global.next[params_t.t],
          i = 0,
          u = [];
      
      for (let j=0; j

    (1) L. Wang and X. Wang. A Comparative Study on the Algorithms for a Generalized Josephus Problem. Applied Mathematics & Information Sciences, 7, No. 4, 1451-1457 (2013).

    (2) References from Wilson (1979):

    Knuth, D. E., The Art of Computer Programming, Addison-Wesley, Reading Mass., Vol I Fundamental Algorithms, 1968, Ex. 22, p158; Vol. III, Sorting and Searching, Ex. 2, pp. 18-19; Vol. I, 2-nd ed., p.181.

    Ahrens, W., Mathematische Unterhaltungen und Spiele, Teubner: Leipzig, 1901, Chapter 15, 286-301.

    Kaplansky, I. and Herstein I.N., Matters Mathematical, Chelsea, New York, 1978, pp. 121-128.

提交回复
热议问题