中科大算法设计与分析
算法设计与分析_总结7

第一章:算法定义: 算法是若干指令的有穷序列, 满足性质: (1)输入: 有外部提供的量作为算法的输入。
(2)输出: 算法产生至少一个量作为输出。
1. (3)确定性:组成算法的每条指令是清晰, 无歧义的。
2. (4)有限性:算法中每条指令的执行次数是有限的, 执行每条指令的时间也是有限的。
3. 程序定义: 程序是算法用某种程序设计语言的具体实现。
可以不满足算法的性质(4)。
4. 算法复杂性分为时间复杂性和空间复杂性。
5. 可操作性最好且最有使用价值的是最坏情况下的时间复杂性。
6. O(n)定义: 存在正的常数C 和自然数N0, 当N>=N0时有f(N)<=Cg(N),则称函数f(N)当N 充分大时有上界, 记作f(N)=O(g(n)). 7. Ω(n)定义: 存在正的常数C 和自然数N0, 当N>=N0时有f(N)>=Cg(N),则称函数f(N)当N 充分大时有上界, 记作f(N)=Ω(g(n)). 8. (n)定义:当f(n)=O(g(n))且f(N)=Ω(g(n)), 记作f(N)= (g(n)), 称为同阶。
求下列函数的渐进表达式: 3n2+10n ~~~O(n2) n2/10+2n~~~O(2n) 21+1/n~~~O(1) logn 3~~~O(logn) 10log3n ~~~O(n) 从低到高渐进阶排序: 2 logn n2/3 20n 4n2 3n n!第二章:1. 分治法的设计思想: 将一个难以直接解决的问题, 分割成一些规模较小的相同问题, 以便各个击破分而治之。
2. 例1 Fibonacci 数列 代码(注意边界条件)。
int fibonacci(int n) {if (n <= 1) return 1;return fibonacci(n-1)+fibonacci(n-2);}3. Ackerman 函数双递归。
A(1,1)代入求值。
A(1,1)=A(A(0,1),0)=A(1,0)=24. 全排列的递归算法代码。
算法设计与分析

算法设计与分析在过去的几十年里,计算机科学领域取得了巨大的发展,尤其是算法设计与分析方面。
算法设计与分析是计算机科学中的一项核心技术,对于计算机应用和软件开发有着重要的意义。
本文将探讨算法设计与分析的基本概念、应用领域和最新研究进展。
一、算法设计与分析的概念算法是一系列解决问题的步骤或规则,它们可以被计算机程序实现。
算法设计是制定解决问题的步骤和规则的过程,而算法分析则是评估算法效率和性能的过程。
算法设计与分析的目标是寻找解决问题的最优算法。
最优算法指的是在给定资源(如时间、空间)限制下,能够以最快速度或以最小的资源消耗解决问题的算法。
为了达到这个目标,算法设计与分析需要考虑多个因素,包括时间复杂度、空间复杂度、可行性等。
二、算法设计与分析的应用领域算法设计与分析广泛应用于各个领域,以下是几个典型的应用领域示例:1. 数据结构与算法:在数据结构与算法领域,算法设计与分析被用于解决各种基本和高级的数据操作和算法问题,如排序、查找、图算法等。
2. 人工智能与机器学习:在人工智能和机器学习领域,算法设计与分析是构建智能系统和训练模型的关键技术。
例如,最优化算法、聚类算法和分类算法等都需要经过严格的设计与分析。
3. 网络与图论:在网络和图论领域,算法设计与分析用于解决网络拓扑结构、路径规划、最大流问题等复杂的图算法问题。
4. 加密与安全:在加密与安全领域,算法设计与分析被广泛应用于密码算法、数字签名算法、身份验证算法等。
三、算法设计与分析的最新研究进展算法设计与分析领域持续发展,涌现出了许多令人瞩目的研究成果,以下是一些最新的研究进展:1. 并行算法设计:随着多核处理器的普及,研究人员对并行算法设计进行了深入研究,以提高算法的并行性和效率。
2. 量子算法设计:量子计算的兴起引发了对量子算法设计与分析的研究。
研究人员致力于开发适用于量子计算机的高效算法,以解决目前对传统计算机来说是不可解的问题。
3. 大数据算法设计:随着大数据时代的到来,研究人员致力于开发高效的大数据算法和数据处理技术,以应对海量数据的处理和分析需求。
算法设计与算法分析

算法设计与算法分析算法设计是计算机科学中的重要概念,它是指为解决特定问题而设计的一组有序步骤。
在实际应用中,我们需要根据问题的特点和要求,选择合适的算法设计方法,并对其进行分析和评估。
一、算法设计的基本要求1. 正确性:设计的算法必须能够正确地解决问题,即能够产生预期的输出结果。
2. 稳定性:算法在不同的输入条件下能够得到相同的输出结果。
3. 可读性:算法应该具备良好的可读性,便于程序员进行阅读、理解和修改。
4. 高效性:算法的执行效率应该尽可能地高,以便在较短的时间内得到结果。
二、算法设计的方法1. 枚举法:逐一尝试所有可能的解决方案,从中选择最优解。
2. 递推法:将大问题分解为多个小问题,逐步求解,最后得到整体的解决方案。
3. 贪心法:每一步选择当前情况下的最优解,从而希望得到最终的最优解。
4. 分治法:将大问题分成多个小问题,分别求解,最后将各个小问题的解合并为整体的解决方案。
5. 动态规划法:通过构造最优子结构,从而逐步求解问题的最优解。
6. 回溯法:通过搜索所有可能的解空间,找到满足条件的解。
三、算法分析的方法1. 时间复杂度:用来衡量算法执行所需的时间,可以反映出算法的执行效率。
2. 空间复杂度:用来衡量算法执行所需的额外空间,如内存和存储空间。
3. 正确性分析:通过证明或反证法,分析算法的正确性。
四、算法设计与算法分析的应用1. 排序算法:如冒泡排序、插入排序、快速排序等。
2. 查找算法:如线性查找、二分查找、哈希查找等。
3. 图算法:如深度优先搜索、广度优先搜索、最短路径算法等。
4. 字符串匹配算法:如朴素字符串匹配、KMP算法、Boyer-Moore算法等。
5. 数据压缩算法:如Huffman编码、LZW算法、Run-length算法等。
五、结语在计算机科学领域中,算法设计与算法分析是非常重要的核心问题。
通过选择合适的算法设计方法,并对其进行准确和全面的分析,我们能够得到高效、稳定且可读性强的算法解决方案。
计算机算法设计与分析-中国科学院大学

中国科学院大学硕士研究生入学考试《计算机算法设计与分析》考试大纲一、考试科目基本要求及适用范围概述本计算机算法设计与分析考试大纲适用于中国科学院大学工业工程专业硕士研究生入学考试。
计算机算法设计与分析是工业工程专业方向,特别是信息技术相关领域的重要基础课程,为使用计算机分析、解决工程实际问题提供基础数学理论和方法的支持。
本科目的考试内容主要包括基础数据结构、计算机算法分析的一般性理论和数学方法、算法设计的常用方法及其分析方法等,要求考生对算法相关的基本概念有较深入、系统的理解,掌握算法设计与分析所涉及的基本理论和方法,并具有综合运用所学知识分析问题和解决问题的能力。
二、考试形式考试采用闭卷笔试形式,考试时间为180分钟,试卷满分150分。
试卷结构:计算分析题、算法设计题。
三、考试内容:(一)基础数据结构(熟练掌握)1.数据结构的基本概念、逻辑结构和存储结构;2.线性表、栈与队列;3.数组与广义表;4.树、二叉树与图。
(二)算法分析基础(灵活运用)1.函数的渐进阶,基于渐进阶的函数分类;2.递归和数学归纳法,递推方程求解,主定理;3.算法分析的目的和意义,算法的正确性概念,算法的时间复杂度和空间复杂度;4.最坏情况时间复杂度和平均时间复杂度的定义和基本计算方法。
(三)分治法与排序算法(灵活运用)1.分治法的基本原理、设计方法和适用条件;2.排序算法的设计与分析:插入排序、快速排序、归并排序、堆排序;3.以比较为基本操作的排序算法时间复杂度下界分析。
(四)选择与检索(掌握)1.选择算法设计,对手论证法;2.动态集合(并查集),并查集上的合并查找程序;3.分摊时间分析方法。
(五)高级算法设计与分析技术(熟练掌握)1.贪心算法设计及分析;2.动态规划算法设计及分析;3.字符串匹配算法(KMP算法、BM算法、近似匹配算法)。
(六)图算法(熟练掌握)1.图的表示和数据结构;2.图的搜索与遍历(有向图的深度和广度优先搜索、有向无环图的拓扑排序、有向图的强连通分量、无向图的深度优先搜索);3.最小生成树(Prim算法、Kruskal算法);4.单源最短路径(Dijkstra算法)。
中科大软院算法实验一报告

inti =p- 1;
for(intj =p; j <=r- 1; j++)
{
if(A[j] <= x) {
i j);
}
}
Exchange(A, i + 1,r);
returni + 1;
}
//在左右两个区间进行递归调用本身
voidquick_sort(intA[],intp,intr)
for(int i = 0;i < length;i++){
cout<<array[i]<<endl;
}
end = clock();
cout<<"优化排序时间为:"<< end - start<<endl;;
}
void QUICK_INSERT_SORT (int A[],int n,int k)
{
{
quick_sort(A,0,n,k);
int i=0;
int x=0;
for(int j=1;j<=n;j++)
{
x = A[j];
i = j;
while(i > 0 && A[i - 1] > x)
{
A[i] = A[i - 1];
i--;
}
A[i] = x;
}
}
三、结果与分析:
题目一:
下面是运行快速排序算法,首先生成1000个随机数组成的数组,然后对这1000个随机数进行排序,最后利用c++的时间函数对整个数组输出进行统计时间,得到的时间为743.
中科院计算机算法设计与分析各章作业 历年习题.

设在新机器上用 t 秒时间能解决输入规模为 N 的问题,则
由于新复杂度
T新 ( N )
N2
,新机器的运行速度为 t新
t0 64
,
代入关系式T新(N) *t新 t ,得
N
2
*
t0 64
t
3* 2n
*t0
,
解得
N 8 3 2n
3)若进一步改进算法,最新的算法的时间复杂度为 T (n) 8 ,其余条件不
1).f (n) O(F(n)), g(n) O(G(n)) f (n) / g(n) O(F(n) / G(n)) ;错 2).f (n) O(F(n)), g(n) O(G(n)) f (n) / g(n) (F(n) / G(n)) ;错 3).f (n) O(F(n)), g(n) O(G(n)) f (n) / g(n) (F(n) / G(n)) ;错 4).f (n) (F(n)), g(n) (G(n)) f (n) / g(n) (F(n) / G(n)) ;错 5).f (n) (F(n)), g(n) (G(n)) f (n) / g(n) (F(n) / G(n)) 。错 6). f (n) (F(n)), g(n) (G(n)) f (n) / g(n) (F(n) / G(n)) 对
for(int i=0; i<m; i++) for(int j=0; j<p; j++){ T sum=0; for(int k=0; k<n; k++) Sum+=a[i][k]*b[k][j]; C[i][j]=sum; }
算法设计与分析

算法设计与分析算法是计算机科学的核心内容之一,它是解决问题和完成任务的方法和步骤的描述。
良好的算法设计能够提高计算效率和解决问题的准确性。
本文将介绍算法设计与分析的基本概念、方法和技巧。
一、算法设计的基本概念1.1 算法的定义算法是对问题求解方法的一种描述,它包括输入、输出和解决问题的步骤和流程。
1.2 算法评估的标准算法评估主要考虑算法的正确性、效率和可读性等方面。
正确性是指算法能够输出正确的结果;效率是指算法解决问题的速度和所需资源的数量;可读性是指算法的表达清晰易懂。
二、算法设计的方法2.1 分治法分治法将问题划分为多个子问题,然后分别解决子问题,并将子问题的解合并成原问题的解。
2.2 动态规划动态规划是一种通过将问题划分为多个状态和状态转移方程来解决问题的方法,它避免了重复计算,提高了计算效率。
2.3 贪心算法贪心算法每次选择当前情况下最优的解决方案,但不一定能得到全局最优解。
2.4 回溯法回溯法是一种通过不断尝试解的选择,并返回上一步选择的方法,用于求解组合优化问题或搜索问题。
三、算法分析的技巧3.1 时间复杂度分析时间复杂度衡量了算法所需的计算资源,通常使用大O表示法来表示。
3.2 空间复杂度分析空间复杂度衡量了算法所需的存储资源,通常也使用大O表示法来表示。
3.3 最坏情况和平均情况分析最坏情况分析保证算法在任何情况下都能得到正确结果的时间复杂度;平均情况分析是对算法在各种输入情况下的期望性能的评估。
四、算法设计与实践4.1 排序算法排序算法是算法设计与分析领域中常见的问题,如冒泡排序、插入排序、选择排序和快速排序等。
4.2 查找算法查找算法用于在一组数据中寻找特定元素或满足特定条件的元素,如二分查找和哈希查找等。
4.3 图算法图算法用于解决图结构相关的问题,如最短路径算法、最小生成树算法和拓扑排序等。
总结算法设计与分析是解决问题和完成任务的关键方法之一。
通过合理选择和设计算法,可以提高计算效率和解决问题的准确性。
算法设计与分析

算法设计与分析算法设计与分析是计算机科学中非常重要的一门学科,它涉及到如何设计高效的算法,并通过对其进行分析来评估其效率和性能。
在本文中,我们将探讨算法设计与分析的基本概念和方法。
一、算法设计算法设计是指为解决特定问题而设计的一组指令或计算步骤。
一个好的算法应当满足以下几个基本要求:1.正确性:算法必须能够得出正确的结果,并在所有输入情况下都能正常运行。
2.可读性:算法应当易于理解和实现,使其他人能够轻松读懂和修改。
3.健壮性:算法应当能够处理各种异常和边界情况,避免程序崩溃或产生错误结果。
4.高效性:算法的时间复杂度和空间复杂度应当尽可能低,以提高算法的执行速度和资源利用率。
二、算法分析算法分析是评估算法性能和效率的过程,它主要包括时间复杂度和空间复杂度的分析。
时间复杂度是指算法执行所需的时间量度,通常使用大O记号来表示。
空间复杂度是指算法执行所需的内存空间量度。
1.时间复杂度分析时间复杂度可以用来评估算法在处理输入规模增长时的性能表现。
常见的时间复杂度有常数时间O(1)、对数时间O(log n)、线性时间O(n)、线性对数时间O(n log n)、平方时间O(n^2)等。
选择合适的算法和数据结构,可以通过优化时间复杂度来提高算法的执行效率。
2.空间复杂度分析空间复杂度可以用来评估算法在使用额外内存空间时的性能表现。
常见的空间复杂度有常数空间O(1)、线性空间O(n)、二维空间O(n^2)等。
合理管理内存空间的使用,可以通过优化空间复杂度来提高算法的内存利用率。
三、算法设计与分析的应用算法设计与分析在计算机科学的各个领域都有广泛的应用。
以下是一些常见的应用场景:1.排序算法:在数据处理中,排序是一个基本操作。
通过设计高效的排序算法可以提高数据的处理效率,常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序等。
2.图算法:在图论和网络分析中,图算法用于解决各种关于图的问题,如最短路径、最小生成树、拓扑排序等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
dlogRH(g, a p) { // 求 logg,pa, a = g mod p,求 x // Sherwood 算法 r ← uniform(0..p-2); b ← ModularExponent(g, r, p); //求幂模 b=g mod p,定理 1 真数的一部分 c ← ba mod p; //((g modp)(g modp))modp=g modp=c, 定理 2 中的真数 y ← logg,pc; // 使用确定性算法求 logp,gc, y=r+x,定理 2
π
算法: SetCount (X) { k ← 0; S ← Ф; a ← uniform(X); do { k++; S ← S∪,a-; a ← uniform(X); } while (a∉S) return 2k2/π } 复杂度:注意:∵k 的期望值是√ ,∴上述算法 n 需足够大,且运行多次
1.1.2.4 例 1:选择和排序的 Sherwood 算法 只需进行简单的打乱顺序即可,u 即表示打乱顺序函数 shuffle Shuffle (T) { n ← length* T +; for i ← 1 to n-1 do { // 在 T[ i..n ]中随机选 1 元素放在 T[ i ]上 j ← uniform(i..n); T* i + ←> T* j +; } } 1.1.2.5 例 2:离散对数计算 问题描述:设 a=gx mod p,记 logg,pa=x,称 x 为 a 的(以 g 为底模除 p)对 数。从 p,g,a 计算 x 称为离散对数问题。 问题在于:给出 p,g,a,怎么求 x 简单算法: ① ∀x, 计算 gx 最多计算 0≤x≤ p-1 或 1≤x≤p,因为实际上离散对数<g>是循环群; ② 验证 a=gx mod p 是否成立。 dlog(g, a, p) { // 当这样的对数不存在时,算法返回 p x ← 0; y ← 1; do { x++; y ← y*g; // 计算 y=gx - while ( a ≠ y mod p) and (x ≠ p); return x } 问题:最坏 O(p),若 P 很大怎么办?所以简单算法不行 而且 x 的算出来的快慢取决于 a 的取值, a 的取值能够让算法较早找到正 确的 x,则算法很快就完了,否则很慢,直到 p。 Sherwood 算法解决方法 根据上面的分析,Sherwood 算法应该使得这个算法不会根据 a,p 的取值 影响算法的快慢 定理: 1. Logg,p(st mod p) = (logg,p s + logg,p t) mod (p - 1) 2. Logg,p(gr mod p) = r, 0 <= r <= p – 2
1.1.2.3 Sherwood 算法的过程 确定算法 f(x)可改造为 Sherwood 算法: RH(x) { // 用 Sherwood 算法计算 f(x) n ← length*x+; // x 的 size 为 n r ← uniform(An); // 随机取一元素 y ← u(x, r); //将原实例 x 转化为随机实例 y s ← f(y); // 用确定算法求 y 的解 s return v(r, s); // 将 s 的解变换为 x 的解 }
和 MC 算法一样,成功的概率亦随算法执行时间增加而增加。无论输入何种实例, 只要算法在该实例上运行足够的次数,则算法失败的概率就任意小。 1.1.4 Sherwood 算法 Sherwood 算法总是给出正确的答案。 当某些确定算法解决一个特殊问题平均的时间比最坏时间快得多时,我们可以使用 Sherwood 算法来减少,甚至是消除好的和坏的实例之间的差别。 1.2 算法的实现方式 1.1.1 数字算法 1.1.1.1 HitorMiss 算法计算积分(面积法) HitorMiss (f, n) { k ← 0; for i ← 1 to n do , x ← uniform(0, 1); y ← uniform(0, 1); if f(x,y)在满足的面积内 then k++; } return k/n; } 1.1.1.2 Crude 算法计算积分(积分化求平均值法) Crude (f, n, a, b) { sum ← 0; for i ← 1 to n do , x ← uniform(a, b); sum ← sum + f(x); } return (b-a)sum/n; } 1.1.1.3 两种方法的比较 对于给定的迭代次数 n,Crude 算法的方差不会大于 HitorMiss 的方差。但不能 说,Crude 算法总是优于 HitorMiss。因为后者在给定的时间内能迭代的次数更 多。 例如, 计算 π 值时, Crude 需计算平方根, 而用投镖算法 darts 时, 即 HitorMiss 无需计算平方根。 1.1.1.4 确定的算法——梯形算法(上底加下底乘以高除以 2) Trapezoid (f, n, a, b) { // 假设 n ≥ 2 delta ← (b-a)/(n-1); sum ← (f(a) + f(b))/2; for x ← a+delta step delta to b – delta do sum ← sum + f(x) return sum × delta; }
一般地,在同样的精度下,梯形算法的迭代次数少于 MC 积分,但是有时确定 型积分算法求不出解,若用 MC 积分则不会发生该类问题,或虽然发生,但概率小 得多。 在确定算法中, 为了达到一定的精度, 采样点的数目随着积分维数成指数增长, 例如,一维积分若有 100 个点可达到一定的精度,则二维积分可能要计算 1002 个 点才能达到同样的精度,三维积分则需计算 1003 个点。(系统的方法) 但概率算法对维数的敏感度不大, 仅是每次迭代中计算的量稍增一点, 实际上, MC 积分特别适合用于计算 4 或更高维数的定积分。 若要提高精度,则可用混合技术:部分采用系统的方法,部分采用概率的方法 1.1.1.5 例 1:求集合的势 问题描述:估算一个集合中元素的个数 解决思路:设 X 是具有 n 个元素的集合,我们有回放地随机,均匀和独立 地从 X 中选取元素,设 k 是出现第 1 次重复之前所选出的元素数目,则当 n 足够大时,k 的期望值趋近为β√n,这里 β = √ 2 ≈ 1.253 利用此结论可以得出估计|X|的概率算法: β√n = √ ������������ 2������ 2 =k ⟹n= 2 ������
Edit by James Wu 2011/1/10 1. 概率算法部分 1.0 几个基本概念 1.0.1 期望时间和平均时间的区别 确定算法的平均执行时间:输入规模一定的所有输入实例是等概率出现时, 算法的平均执行时间 概率算法的期望执行时间:反复解同一个输入实例所花的平均执行时间 概率算法的平均期望时间:所有输入实例上平均的期望执行时间 概率算法的最坏期望时间:最坏的输入实例上的期望执行时间 1.0.2 Uniform 函数 在 X 中随机,均匀和独立地取一个元素的算法: ModularExponent(a, j, p){ //求方幂模 s=aj mod p, 注意先求 aj 可能会溢出 s ← 1; while j>0 do { if (j is odd) s ← s·a mod p; a ← a2 mod p; j ← j div 2; } return s; } Draw (a, p) { // 在 X 中随机取一元素 j ← uniform(1..p-1); return ModularExponent(a, j, p); // 在 X 中随机取一元素 } 1.1 概率算法的分类 1.1.1 数字算法 主要用于找到一个数字问题的近似解 使用的理由 现实世界中的问题在原理上可能就不存在精确解, 例如, 实验数据本身就是近似的, 一个无理数在计算机中只能近似地表示 精确解存在但无法在可行的时间内求得,有时答案是以置信区间的形式给出的 1.1.2 Monte Carlo 算法 特点:MC 算法总是给出一个答案,但该答案未必正确,成功(即答案是正确的)的概率 正比于算法执行的时间 缺点:一般不能有效地确定算法的答案是否正确 1.1.3 Las Vagas 算法 LV 算法绝不返回错误的答案。 特点:获得的答案必定正确,但有时它仍根本就找不到答案。
2 ������������
后才能确定 n=|X|,即取多次运行后的平均值才能是 n。 该算法的时间和空间均为θ(√n),因为k = θ(√n)
1.1.1.6 例 2:多重集合中不同数目的估计 用散列表π(m + 1), m = 5 + lg M,若以元素 e 的 hash(e)以 00…01 开头(前面 k-1 个 0) ,则π(������) = 1 最后返回π中第一个出现 0 的位置z,则集合中不同元素的下界和上界分别是 [2z-2, 2z] 复杂度:时间 O(N),空间:O(lgN)
r x r+ห้องสมุดไป่ตู้ r
return (y-r) mod (p-1); // 求 x,定理 1 }
在这里,唯一耗费时间的是 b ← ModularExponent(g, r, p),它的执行时间与
a,p 的取值无关,只与随机取出的 r 有关 1.1.2.6 例 3:搜索有序表
问题描述:在有序表中搜索 x,如果存在返回其 index 基本搜索函数: Search(x, i) { //从 index = i 开始搜索 x,这是一个顺序查找过程 while x > val[i] do i ← ptr*i+; return i; } 4 种算法: A(x), 时间复杂度 O(n) A(x) { return Search(x, head); } D(x),时间复杂度 O(n/3) D(x) { i ← uniform(1..n); y ← val*i+; case { x < y: return Search(x, head); // case1 x > y: return Search(x, ptr[i]); // case2 otherwise: return i; // case3, x = y } } B(x),时间复杂度 O(√������) 算法基本思想: 对于一个有序表 S,它上面的元素分别是 a1,a2,…,an,它们之间可 以是乱序的,要查找的 x 是其中一员。 若把 a1,a2,…,an 有序排列成为 ao1<ao2<…<aon,x 仍然是其中一员。 把 ao1<ao2<…<aon 划分成 L 个区间, x 也必然是某个区间中的一员。 那么根据 Search(x, i)是一个有序查找过程,只需要找到 x 所在区 间中在 x 之前的元素的 index,或者 x 所在区间的前面任何一个区间 的元素的 index,在调用 Search(x, index),其时间肯定不超过 2n/L, 而且期望时间是 n/L。 而根据 S 中元素分布的均匀性, a1,a2,…,an 排列的前 L 个元素在概 率上, 是由 ao1<ao2<…<aon 的 L 划分中, 每个区间各取一个元素组成的, 所以会出现: ao1<ao2<…<aon 的 L 划分中 x 所在区间中在 x 之前的元素, 或者是,x 所在区间的前面任何一个区间的元素,满足这两点中的任 意一点即可,数越大越靠近 X。 那么算法可以这么描述:找 S 的 a1,a2,…,an 序列的前 L 个元素中 最大的数,得到它的 index,然后用 Search(x, index),经过期望时间