Josephus问题的定义如下:假设n个人排成环形,且有一正整数m<=n。从某个指定的人开始,沿环报数。每遇到第m个人就让其出列,且报数进行下去,这个过程直到所有人都出列为止。假设m不是常数。请描述一个O(nlgn)时间的算法,使给定的整数n和m,输出(n,m)-Josephus排列。
解法:使用顺序统计树(order-statistic tree),顺序统计树的插入、删除的时间复杂度为O(lgn),查找第i大的数的时间复杂度也为O(lgn)。
伪代码:
JOSEPHUS(n,m)
initialize T to be empty
1. for j ← 1 to n
do create a node x with key[x] = j
OS-INSERT(T, x)
k ← n
j ← m
2.while k > 2
do x ← OS-SELECT(root[T ], j )
print key[x]
OS-DELETE(T, x)
k ← k − 1
j ← (( j + m − 2) mod k) + 1
3.print key[OS-SELECT(root[T ], 1)]
1.建立顺序统计树
2.先找出第j=m大的数,打印,然后从顺序统计数中将其删除,则下一个要删除的数为此时序列中第j+m-1大的数(序列的长度已经减小了1,所以是j+m-1而不是j+m),因为j+m-1可能大于n,所以写成 ((j+m-2)mod k) + 1
3.打印最后一个数
分享到:
相关推荐
解法1—O(N^2)解法 解法2—O(NlgN)解法 解法3—O(N)解法 可以直接在记事本运行
电路布线问题求解的改进算法 O(nlgN)的算法 内有3个pdf 都是对同一问题的不同方面的描述及推广
归并排序并不像快速排序那样最坏情况时间复杂度变成On2,归并排序最坏情况仍然是Onlgn,大家可以看看
输入序列,求最长上升子序列的长度,算法复杂度nlgn
时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶...
O(nlgn) Delaunay Triangulation
使用分治法在O(nlgn)复杂度内求出最近点对
(nlgn) - Θ (nlgn) - O (nlgn) :blue_book: - O (nlgn) - O (n 2 ) - O (n 2 ) - O (n 2 ) - O (n + k) - Θ (n + k) - O (d * n) 图论 - O (V + E) - O (V + E) - O (V + E) - O (V + E) - O (V + E) - O (V + E) ...
最优二叉查找树,为算法导论上的算法,时间复杂度O(nlgn),思考题15.5-
Java-德劳内三角剖分一个基于gui的简单Java应用程序,它在O(nlgn)中的二维点集上计算Delaunay三角剖分。 在数学和计算几何学中,平面中一组P点的Delaunay三角剖分是DT(P)三角剖分,因此P中的任何点都不在DT(P)...
求Joseph排列 先建立具有n个结点的平衡二叉树,在建树的过程中记录每个结点的次序,然后用求余运算计算所查找的结点的位置,输出该结点元素,并删除,如此直到输出最后一个元素。由于向平衡二叉树中插入的元素本身...
算法导论第30章多项式乘法 FFT算法 复杂度O(nlgn)
利用归并排序求逆序数,复杂度在O(nlgn)含测试用例
对k排序,运行时间O(nlgn/k)),为算法导论8-5习题
最长单调递增子序列,运行时间为O(nlgn),为算法导论上的算法
结论:归并排序和堆排序维持O(nlgn)的复杂度,速率差不多,表现优异。固定基准的快排表现很是优秀。而通过使用一个循环完成按增量分组后的直接插入的希尔排序,测试效果显著。 冒泡,选择,直接插入都很慢,而冒泡...
测试输入的数组中有多少个逆序对,本程序在归并排序的基础上实现,时间复杂度为O(nlgn)
快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn)。最差时间复杂度的情况为数组基本有序的时候,平均时间复杂度为数组的数值分布较为平均的时候。在平时情况下快速排序跟堆排序的时间复杂度都为O(nlgn),...
1. 要使得递归方程 T(n)=3/2T(2n/b)+lgn 的解是 O(n),常数 a 必须为 2. 下列各式中错误的而是 3. 下列各式中解为 O(nlgn
O(nlgn) => 抽取顶部元素后,用最末元素补上并调整树 冒泡排序 ----分治---- 第k大的数 * LeetCode 215 partition,而且单边就行,O(n) 数组连续的最大和 * 和一些炒股问题类似 数组中有正有负有0 解法1: 分治 => ...