josephus问题

作者: 苟雨 | 来源:发表于2016-11-07 20:51 被阅读25次

    线性表是数据结构的中很常见的结构,其中一种就是顺序表,python已经内置了顺序表。list就是循序表的的实现。
    下面就用顺序表解决一些有趣的问题!
    josephus 问题开始链表上的经典问题,问题如下:假设有n个人围坐一圈,现在要求从第k个人开始报数,报到第m个数的人退出,然后从下一人开始继续报数重复上述规则,直到所有人退出。要求按顺序输出各出列人的编号。

    #coding:utf-8
    import time
    def josephus(n,k,m):    
      people = list(range(1,n + 1))    # 将开始的i置为指定的k 减1是由于数组下标的缘故   
      i = k - 1                         
      for num in range(n,0,-1): #每循环一次总数减1       
        i = (i + m - 1) % num        
        print people.pop(i)   
      return
    # 下面这个实现方法不会将退出的人弹出或删除,只是将它置0
    def josephus_no_pop(n,k,m):    
      people = list(range(1,n + 1))    
      i = k - 1    
      for num in range(n):        
         count = 0        # 一定是小于m,由于在循环里面有加一,如果加上等于就会在第一次等于后无限循环!       
         while count < m:            
           if people[i] > 0:                
           count += 1            
           if count == m:                
           print people[i]                
           people[i] = 0            
           i = (i + 1) % n
    if __name__ == '__main__':    
           start = time.clock()    
           josephus(10, 1, 7)    
           print '花费时间:%f' % (time.clock() - start)    
           start = time.clock()    
           josephus_no_pop(10, 1, 7)    
           print '花费时间:%f' % (time.clock() - start)
    
        ```

    相关文章

      网友评论

        本文标题:josephus问题

        本文链接:https://www.haomeiwen.com/subject/uqnouttx.html