此题是算法导论(第二版)第二章习题 2.3-7,题目如下:
请给出一个运行时间为O(n lgn)的算法,使之在给定一个由n个整数构成的集合S和另一个整数x时,判断出S中是否存在有两个其和等于x的元素。
思路一 :我们最容易想到的是O(n2)的算法,大致伪码即:
1 findX(A, x){
2 for i=0 to length[A] {
3 key = A[i]
4 for j=0 to length[A]{
5 if(j != i && key + A[j] == x ){return true}
6 }
7 return false
8 }
这里的算法不符合O(n lgn),所以不行。
思路二:改进思路一中的算法,使第一层循环里面的4--5行的效率为 lgn。
既然4-5行的目的是找到某个符合条件的值,那么我想到了二分查找,二分查找是一个最坏O(lgn)的查找算法,但是前提是集合S有序,于是先要进行排序。伪码如下:
1 findX(A, x){
2 mergeSort(A, 0, length[A]);
3 for i=0 to length[A] {
4 key = A[i]
6 if( binarySearch(A, x-key, 0, length[A]) != i ){return true}
7 }
8 return false
9 }
第2行的归并排序运行时间为O(n lgn), 第3-7行的运行时间为O(n)*O(lgn)= O(nlgn),故总运行时间为O(nlgn)。
思路三:下面的算法来自算法导论的教师手册
1 将集合S排序
2 生成新的集合 S’ = {z: z = x-y} y∈S
3 将S’排序
4 使S或者S’中每个值只出现一次
5 将S和S'进行合并(Merge方法)
6 当且仅当合并后的输出序列中有相同元素,则S中存在两个元素其和等于x。
运行时间分析: 第1步和第3步均为O(n lgn),第2,4,5,6步为O(n), 故总运行时间为O(nlgn)。
分享到:
相关推荐
KNN 算法 - 机器学习算法入门 KNN 算法是机器学习中的一种监督学习算法,全称是 K-Nearest Neighbor,中文称之为 K 近邻算法。它是机器学习可以说是最简单的分类算法之一,同时也是最常用的分类算法之一。 算法...
- **题目描述**:输入两个字符串`a`和`b`,判断`b`是否在`a`中出现,如果有,输出首次出现的位置。 - **解题思路**: - 使用滑动窗口法进行模式匹配。 - 将`b`作为子串在`a`中滑动匹配。 - 当找到匹配位置时,...
- **应用场景**:快速判断两个元素是否属于同一集合。 - **实现方式**:维护一组森林结构,支持合并操作。 #### 6. 二叉堆 - **应用场景**:高效地维护一组有序元素。 - **实现方式**:通过完全二叉树结构存储数据...
- **方法1**: 通过检查所有小于等于该数平方根的正整数是否能整除该数来判断其是否为素数。 - **方法2**: 只检查小于等于该数平方根的所有奇数是否能整除该数。这是因为除了2之外的所有素数都是奇数。 **方法...
·动态规划的两个应用(第15.1节和第15.5节)。 ·利用随机化和线性规划技术的近似算法(第35.4节)。 ·为了使更多的算法可以更早地在书中出现,第1版中有关数学背景知识的三章内容从第一部分移到了附录中,即现在...
Python程序设计入门教程是针对初学者的一份详细指南,涵盖了从基本的编程概念到更高级的数据结构和算法。本教程分为多个知识单元,逐步引导学习者掌握Python编程技能。 第一单元:程序设计语言基础 在第一周的学习...
- **布隆过滤器**:一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。 - **Trie树(字典树)**:用于存储字符串的树形数据结构,特别适用于字符串匹配等问题。 - **红黑树**:一种自平衡二叉...
例如,“x2f(x)11g(x)18f(x)(x)”表明了对两个函数值的大小关系进行比较。 2. 数列和递推关系:内容中出现了数列的递推形式,例如“1-6x11x22x34x48”可能指的是一个数列,每一项是前一项的倍数关系,或者遵循某种...
- 判断图中的两个顶点是否互相可达,找出所有的强连通分量。 8. **二分图匹配**: - 包括匈牙利算法,用于在二分图中寻找最大匹配。 9. **图的割点和桥**: - 割点是指删除后会将图分割成多部分的顶点,桥则是...
- **二分图判定**:检测一个图是否可以被分成两个互不相交的独立集。 - **Union-Find**:并查集算法的应用。 - **Kruskal 最小生成树算法**:构建最小生成树的有效方法。 - **Dijkstra 算法**:解决单源最短路径...
·动态规划的两个应用(第15.1节和第15.5节)。 ·利用随机化和线性规划技术的近似算法(第35.4节)。 ·为了使更多的算法可以更早地在书中出现,第1版中有关数学背景知识的三章内容从第一部分移到了附录中,即现在...
- **解析**:每个题目都需要根据具体的要求来设计解决方案,可能涉及的知识点有:字符串操作(如截取、替换、匹配)、数组和集合的操作(如排序、查找、过滤)、数学算法(如概率计算、几何问题)、逻辑判断(如真假...
- 任意顶点间的最短路径:计算图中任意两个顶点之间的最短路径。 - **4.10 有向无环图及其应用** - 拓扑排序:将有向无环图中的顶点按照一定的顺序排列,使得所有的有向边都是从前面的顶点指向后面的顶点。 - ...
- 扩展欧几里德算法不仅可以求得两个整数的最大公约数,还可以求得它们的贝祖系数。 **2.8 欧拉定理** - 欧拉定理是Fermat小定理的推广形式,适用于任何正整数。 **2.9 线性同余方程** - 线性同余方程\( ax \...
并查集是一种用于处理大量离散集合操作的数据结构,它主要解决的问题是判断元素是否属于同一集合以及合并两个集合。在本精讲中,我们将深入理解并查集的基本概念、核心算法以及通过Java代码实现两个实例。让我们逐一...
- 其他应用还包括判定元素所属的组、判断两个元素是否属于同一类等问题。 4. 并查集的优缺点: - 优点:并查集具有很好的时间复杂度,查找和合并操作在大多数情况下可以达到近乎线性的效果,且实现简单。 - 缺点...
【算法入门习题108道】包含了丰富的编程基础练习,涵盖了字符串处理、数值计算等多个领域,适合初学者提升算法思维。以下是对部分习题的知识点解析: 1. **回文判断**:考察字符串的基本操作,可以使用双指针法,从...