关于“约瑟夫问题_php”的问题,小编就整理了【3】个相关介绍“约瑟夫问题_php”的解答:
约瑟夫问题解题方法?约瑟夫问题是一个经典的数学问题,解决方法有多种。其中一种常用的方法是使用循环链表。首先,创建一个包含所有人的循环链表。然后,从链表的头部开始,每次数到第m个人,就将该人移出链表。
接着,从被移出的人的下一个人开始重新数数,直到只剩下较后一个人为止。这个较后剩下的人就是约瑟夫问题的解。这种方法的时间复杂度为O(n*m),其中n为人数,m为报数的间隔。还有其他解法,如使用递归或数学公式,但循环链表是一种简单且直观的解决方法。
针对不同的数据范围,可以存在如下几种做法:
1.O(nm)
O(nm)的复杂度适用于n,m都在30000以内的情况,此类题型较少,例如“约瑟夫游戏”一题,n,m<=30000,由于随着游戏的不断进行,需要枚举的人数越少,所以复杂度实际低于O(nm)。算法思路:暴力模拟即可。
暴力模拟约瑟夫问题
2.O(n)
O(n)算法已经适用于大多数约瑟夫问题,让n<=1e7的数据范围可以被轻松解决,考虑以任意一人为起点,选出第m个人后的编号变化,设起始id==0,选出第m个人后,id−>(id+m),再回归到原来的圆形,设i表示第i轮游戏,那么整体的公式即为(id+m)%(n−i+1)。倒序枚举即可。也可以用dp方式实现,或者正序枚举,将公式改变为(id+m)%(i+1),较后答案即为id+1。
O(n)递推约瑟夫问题
3.O(mlogn)
此类算法并不常见,但由于一些毒瘤出题人缘故,针对n<=1e9,m<=1e5类型的数据范围,我们不得不采用特别的递推方式,通过打表可以发现,保持m不变,n每加一,答案在模n意义下加m,注意:此时的n是一个变化的n,那么可以通过对n的递推处理,将O(n)级别的枚举,转化为在答案值域区间上的选择性跳跃,从而将以n为基础的算法转向以m为基础的算法,可以处理该类毒瘤问题。
什么叫约瑟问题?约瑟夫问题(有时也称为约瑟夫斯置换,是一个计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,较后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。
分析:(1)由于对于每个人只有死和活两种状态,因此可以用布尔型数组标记每个人的状态,可用true表示死,false表示活。(2)开始时每个人都是活的,所以数组初值全部赋为false。(3)模拟杀人过程,直到所有人都被杀死为止。
约瑟夫法则的真正含义?人们把约瑟夫·佛里兹的辩护称为“约瑟夫法则”。意在告诫世人:
(1)不是所有的“法则”都是好的,社会中有很多冠冕堂皇的法则和理论都是反人类,反伦理的;
(2)流氓之所以能够欺骗蒙蔽世人,在于有一套流氓理论做指导。
案件让全球为之震惊,奥地利人称本案是民族的耻辱,让国家蒙羞。爱尔兰作家爱玛唐纳修(Emma Donoghue)了解了本案后深感震撼,她说“在读到奥地利案件的报导后几天,我的思绪完全被一个念头盘据,一个小孩在监禁中出生,在现代城市中心的祕密隔离环境里,拥有他需要的一切,只除了较重要的一件─自由。这在我看来,是一种可以对人类处境加以阐释的怪异情况,杰克和他妈妈的故事,在某种意义上,可以成为每个人的故事。”遂以本案为素材创作了小说《房间》。
到此,以上就是小编对于“约瑟夫问题_php”的问题就介绍到这了,希望介绍关于“约瑟夫问题_php”的【3】点解答对大家有用。