顺序查找 时间复杂度:O(n)
二分查找(折半查找) 有序数组 O(logn)
时间复杂度,又称"渐进式时间复杂度",表示代码执行时间与数据规模之间的增长关系。
T(n) = O(f(n) )
n:数据规模,通俗点说就是函数中的那个变量n
f(n):代码总的执行次数和数据规模的关系
T(n):代码的执行时间(并不是代码实际的执行时间,这里表示代码执行时间和数据规模之间的关系)
空间复杂度,也称渐进空间复杂度,表示代码存储空间与数据规模之间的增长关系。
O(logn) O(n) O(nlogn) O(n²) O(n!)
选择排序 O(n²)
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
数组(元素带编号 从0开始,位置称为索引) 读取 O(1) 常量时间 插入 O(n)线性时间 删除O(n)
链表(顺序 优势 插入元素) 读取 O(n) 插入 O(1) 删除O(1)
递归 基线条件(函数不调自己) 递归条件(函数调自己)
栈 调用栈
快速排序
找出基线条件(尽可能简单),不断分解问题直到满足基线条件
散列表 基本数据结构之一
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
映射表(map)又称字典(dictionary)、散列表(hash table)或者关联数组(associate array),是一种使用散列实现的数据结构,用来存取条目的容器对象
Java合集框架定义了java.util.Map接口来对映射表建模,三个具体实现类为java.util.HashMap(散列实现)、java.util.LinkedHashMap(使用LinkedList)、java.util.TreeMap(使用红黑树)。
广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。
(1) 使用图来建立问题模型。
(2) 使用广度优先搜索解决问题。
图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合。
无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示。
队列 一种先进先出的数据结构
栈是一种后进先出的数据结构
有向图 无向图
树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。
它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树,没有向上箭头
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。
它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。
加权图 非加权图
np完全问题 Non-deterministic Polynomial的问题,即多项式复杂程度的非确定性问题
所有可以在多项式时间内求解的判定问题构成P类问题
动态规划 网格
分阶段求解决策问题的数学思想。总结 大事化小,小事化了。
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。
1 二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。
2 反向索引 Inverted index, 顾名思义, 是通常意义下索引的倒置。倒排索引,这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置
3傅里叶变换 表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。
f(t)是t的周期函数,如果t满足狄里赫莱条件:在一个以2T为周期内f(X)连续或只有有限个第一类间断点,附f(x)单调或可划分成有限个单调区间,则F(x)以2T为周期的傅里叶级数收敛,和函数S(x)也是以2T为周期的周期函数,且在这些间断点上,函数是有限值;在一个周期内具有有限个极值点;绝对可积。则有下图①式成立。称为积分运算f(t)的傅立叶变换,
4并行算法 就是用多台处理机 联合求解问题的方法和步骤,其执行过程是将给定的问题首先分解成若干个尽量相互独立的子问 题,然后使用多台计算机同时求解它,从而最终求得原问题的解
5 MapReduce 是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Reduce(归约)",是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
6.1布隆过滤器 实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
6.2 HyperLogLog 是Redis的高级数据结构,是统计基数的利器 在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在数学上,基数或势,即集合中包含的元素的“个数”(参见势的比较),是日常交流中基数的概念在数学上的精确化(并使之不再受限于有限情形)。有限集合的基数,其意义与日常用语中的“基数”相同,例如{{a,b,c}的基数是3。无限集合的基数,其意义在于比较两个集的大小,例如整数集和有理数集的基数相同;整数集的基数比实数集的小。
HyperLogLog实际上不会存储每个元素的值,它使用的是概率算法,通过存储元素的hash值的第一个1的位置,来计算元素数量。
7 SHA 算法
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
8 局部敏感的散列算法
局部敏感哈希(Locality Sensitive Hashing,LSH)算法是一种衡量文本相似度的算法。局部敏感哈希是近似最近邻搜索算法中最流行的一种,它有坚实的理论依据并且在高维数据空间中表现优异。它的主要作用就是从海量的数据中挖掘出相似的数据,可以具体应用到文本相似度检测、网页搜索等领域。
局部敏感哈希的基本思想类似于一种空间域转换思想,LSH算法基于一个假设,如果两个文本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的它们也具有很高的相似度;相反,如果它们本身是不相似的,那么经过转换后它们应仍不具有相似性。
9Diffie-Hellman 密钥交换
Deffie-Hellman(简称 DH) 密钥交换是最早的密钥交换算法之一,它使得通信的双方能在非安全的信道中安全的交换密钥,用于加密后续的通信消息。 Whitfield Diffie 和 Martin Hellman 于 1976 提出该算法,之后被应用于安全领域,比如 Https 协议的 TLS(Transport Layer Security) 和 IPsec 协议的 IKE(Internet Key Exchange) 均以 DH 算法作为密钥交换算法。
10 线性规划
线性规划(Linear programming,简称LP),是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法。英文缩写LP。