这是我的任务:
存在一个带有n个整数的循环和排序链表。每个元素都有一个指向下一个更大项的后继指针。列表中最大的项目指向最小的项目。确定传入的目标项是否是列表的成员。您可以通过两种方式访问列表中的项目:您可以跟踪已经访问过的项目的下一个指针,也可以使用函数" RAND"返回指向列表中统一随机项的指针。创建一个随机算法,找到目标项目,并在期望中最多进行O(√n)次传递并始终返回正确答案。
我不确定如何在所需的时间复杂度中构建算法。我认为它与计算和存储列表中的一些总和有关,但不能说明这一步。
答案 0 :(得分:1)
解决方案基于Dave的评论:
使用RAND
sqrt(n)
次,存储最大的元素<目标。表明预计这将在目标的i
范围内。
由列表中最大元素的(i - sqrt(n), i]
索引表示与目标元素相比较少。
现在让我们在sqrt(n)
次试验的sqrt(n)/n = 1/sqrt(n)
范围内计算击中元素的期望值。在每次试验中,击中范围的概率是范围长度除以列表长度,即E = 1/sqrt(n) * sqrt(n) = 1.
,所以
sqrt(n)
因此,我们希望通过在sqrt(n)
试验中选择小于目标的最大元素来检查目标元素的存在,然后线性推进{{1}}个项目。