Josephus 约瑟夫 问题
2010-08-19 15:11
232 查看
http://baike.baidu.com/view/717633.htm
链表方法
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head 解决问题的核心步骤:(程序的基本算法) 1.建立一个具有n个链结点,无头结点的循环链表; 2.确定第1个报数人的位置; 3.不断地从链表中删除链结点,直到链表为空。
这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。算n,m等于一百万,一千万的情况不是问题了。可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。
链表方法
这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head 解决问题的核心步骤:(程序的基本算法) 1.建立一个具有n个链结点,无头结点的循环链表; 2.确定第1个报数人的位置; 3.不断地从链表中删除链结点,直到链表为空。
#include <stdio.h> int main(void) { int n, m, i, s=0; printf ("N M = "); scanf("%d%d", &n, &m); for (i=2; i<=n; i++) s=(s+m)%i; printf ("The winner is %d\n", s+1); return 0 ; }
这个算法的时间复杂度为O(n),相对于模拟算法已经有了很大的提高。算n,m等于一百万,一千万的情况不是问题了。可见,适当地运用数学策略,不仅可以让编程变得简单,而且往往会成倍地提高算法执行效率。
相关文章推荐
- Josephus约瑟夫问题
- 约瑟夫(Josephus)问题的求解——利用循环链表
- 3.java类特征(Josephus约瑟夫问题)
- 约瑟夫(Josephus)问题
- Josephus(约瑟夫)问题----分别用循环链表和数组实现
- 约瑟夫问题(Josephus Problem)
- 约瑟夫问题 The Josephus Problem 非递归算法求解
- 约瑟夫问题-Josephus--及实例说明
- 约瑟夫问题(Josephus Problem)
- Josephus 约瑟夫 问题
- 约瑟夫问题Josephus problem
- Josephus(约瑟夫)环问题的数学方法,使用递推公式。
- josephus problem——约瑟夫问题
- 约瑟夫(Josephus)问题
- C语言通过双向循环链表解决Josephus(约瑟夫)问题
- 约瑟夫问题(Josephus)链表实现
- 约瑟夫问题(Josephus Problem)3:谁最后一个出列
- Josephus problem(约瑟夫问题)
- 约瑟夫(环)问题(Josephus problem)