zoukankan      html  css  js  c++  java
  • 约瑟夫环问题及python与c++实现效率对比

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

    python实现:

    # 单链表节点
    class LinkNode:
        def __init__( self, value ):
            self.value = value
            self.next = None
    
    # 创建循环单链表,值从1开始
    def create_cycle( total ):
        head = LinkNode( 1 )
        prev = head
        index = 2
        while total - 1 > 0:
            curr = LinkNode( index )
            prev.next = curr
            prev = curr
            index += 1
            total -= 1
        curr.next = head
        return head
    
    # 模拟约瑟夫环过程,从1开始计数
    def run( total, m ):
        assert total >= 0, 'total should lq 0'
        assert m >= 0, 'm should lt 0'
        node = create_cycle( total )
        prev = None
        start = 1
        index = start
        while node and node.next:
            if index == m:
                print( 'pop:' + node.value )
                prev.next = node.next
                node.next = None
                node = prev.next
           index = start
    else: prev = node node = node.next index += 1 run( 5, 2 )

     c++实现如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define COUNT_INIT 1   // 计数起点
    
    typedef struct LINKNODE
    {
        int value;
        struct LINKNODE* next;
    }LinkNode, *LinkNodePtr;
    
    // 创建结点
    LinkNodePtr createNode( int value )
    {
        LinkNodePtr node = ( LinkNodePtr )malloc( sizeof( LinkNode ) );
        node->value = value;
        return node;
    }
    
    // 创建循环单链表
    LinkNodePtr createCycle( int total )
    {
        int index = 1;
        LinkNodePtr head = NULL, curr = NULL, prev = NULL;
        head = createNode( index );
        prev = head;
    
        while( --total > 0 )
        {
            curr = createNode( ++index );
            prev->next = curr;
            prev = curr;
        }
        curr->next = head;  // 链表尾结点指向头结点, 构成循环链表
        return head;
    }
    
    // 数到m, 节点出列, 下一个节点继续从1开始数. m不可与COUNT_INIT同值
    void run( int total, int m )
    {
        LinkNodePtr node = createCycle( total );
        LinkNodePtr prev = NULL;
        int index = COUNT_INIT;
    
        while( node && node->next )
        {
            if( index == m )    
            {
                printf( "pop:%d
    ", node->value );
                prev->next = node->next;
                node->next = NULL;
                free( node );
                node = prev->next;
                index = COUNT_INIT;
            }
            else
            {
                prev = node;
                node = node->next;
                index++;
            }
        }
    }
    

      

  • 相关阅读:
    Jquery 跨域问题
    Linux下scp的用法
    JZ2440_V3_内核驱动程序_点亮一个LED灯
    MATLAB GUIDE 上位机串口通信开发 绘制图形
    关于在DSP工程内数组、strnpy函数、atoi函数的使用心得
    Visio中手绘图形的填充
    Ubuntu16.04NFS配置与ARM开发板互传文件_挂载和卸载
    树莓派压力测试工具STui + Stress的使用
    如何将代码优雅的插入到word中
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/tudas/p/joseph-cycle-issue.html
Copyright © 2011-2022 走看看