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.打印最后一个数
分享到:
相关推荐
标题中的"O(nlgn)"算法表明我们关注的是一个时间复杂度为n对数n的解决方案,这通常意味着我们正在讨论一种高效的算法。 第一个文件《电路布线问题的一种推广及其算法》可能探讨了电路布线问题的扩展形式,可能是...
解法1—O(N^2)解法 解法2—O(NlgN)解法 解法3—O(N)解法 可以直接在记事本运行
归并排序并不像快速排序那样最坏情况时间复杂度变成On2,归并排序最坏情况仍然是Onlgn,大家可以看看
解法 2:O(NlgN)解法 这个解法使用分治法来解决问题。我们可以将数组分成左半部分和右半部分,然后计算这两部分中的最大连续子序列和,最后求出总的最大值。代码实现如下: ```cpp int maxsequence2(int a[], int ...
输入序列,求最长上升子序列的长度,算法复杂度nlgn
1. 堆排序:是一种选择类排序,时间复杂度为O(nlgn)。它的基本操作是将当前无序区的堆顶记录与该区间的最后一个记录交换,然后将新的无序区调整为堆。 2. 归并排序:是一种稳定的排序算法,时间复杂度为O(nlgn)。它...
根据平均时间复杂度,可以将排序算法分为四类:平方阶 O(n^2) 排序、线性对数阶 O(nlgn) 排序、O(n^m) 排序和线性阶 O(n) 排序。 * 平方阶 O(n^2) 排序:包括直接插入排序、选择排序、冒泡排序等,这类排序算法的...
时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶变换FFT实现了大整数乘法。时间复杂度从O(n2)降低到了O(nlgn) 利用快速傅里叶...
- 使用后缀树技术可以进一步提高算法的效率,达到O(NlgN+D^2)的时间复杂度。 #### 理论贡献与实际意义 - **理论贡献**:通过将LCS和SES问题转化为编辑图上的最短路径/最长路径问题,不仅简化了算法的设计,也为...
(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)...
快速排序算法的平均时间复杂度通常被认为是O(nlgn),其中n是待排序数据的个数。 尽管快速排序在平均情况下性能优越,但其性能在数据有序或者基本有序的情况下会出现瓶颈,此时算法效率会降低,特别是当待排序的序列...
这些比较排序的最好、最坏和平均时间复杂度通常为O(nlgn),这是基于比较的排序算法的一个理论极限。 然而,决策树的概念被引入来探讨是否有可能突破这个限制。决策树是一种数据结构,用于表示一系列比较操作,每...
- (4) h(n)=O(nlgn):虽然h(n)含有nlgn项,但其最高次项是n^1.5,因此h(n)不能简单地用O(nlgn)表示。 通过以上分析,我们可以看到数据结构的学习不仅需要理论知识的掌握,还需要通过大量实践来深化理解和应用。...
求Joseph排列 先建立具有n个结点的平衡二叉树,在建树的过程中记录每个结点的次序,然后用求余运算计算所查找的结点的位置,输出该结点元素,并删除,如此直到输出最后一个元素。由于向平衡二叉树中插入的元素本身...
利用归并排序求逆序数,复杂度在O(nlgn)含测试用例
对k排序,运行时间O(nlgn/k)),为算法导论8-5习题
一般情况下,快速排序与随机化快速排序的平均情况性能都达到了O(nlgn)。 快速排序是一种不稳定的排序方法,元素a1, a2的关键字有a1.key=a2.key,快速排序不能保证a1, a2在排序后维持原来的位置先后关系。 快速排序...
- (4) h(n) = O(nlgn) 不成立,因为在n趋于无穷大时,n^1.5的增长速度快于nlgn。 在实际问题中,我们还需要将算法的执行时间表示为问题规模的函数。例如: - (1) i=1; k=0; while(i) {k=k+10*i; i++;} 的时间复杂度...