时间复杂度

C++排序算法代码汇总

寵の児 提交于 2019-12-02 06:48:39
排序算法稳定性:两个相同的元素排序前后的相对位置关系不会发生改变。 复杂度比较 算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 稳定性 冒泡排序 O(N^2) O(N^2) O(N^2) O(1) 稳定 插入排序 O(N^2) O(N) O(N^2) O(1) 稳定 选择排序 O(N^2) O(N^2) O(N^2) O(1) 稳定 希尔排序 O(N ^ 3/2 ) O(N^2) O(1) 不稳定 堆排序 O(NlogN) O(NlogN) O(NlogN) O(1) 不稳定 归并排序 O(NlogN) O(NlogN) O(NlogN) O(N) 稳定 快速排序 O(NlogN) O(NlogN) O(N^2) O(logN) 不稳定 冒泡排序 排序过程 将第一个元素与第二个元素比较大小,如果第一个元素大于第二个元素则调换他们两的位置; 比较第二个元素和第三个元素的大小,如果第二个元素大于第三个元素则调换他们两的位置; 依次类推,进行两两元素的比较和交换,最终最大的元素排在了最后面; 重复1到3过程,直到所有元素都排序。 图片演示 //冒泡排序 //平均时间复杂度:O(N^2) //最坏情况复杂度:O(N^2) //空间复杂度:O(1) //稳定排序 void bubblesort(vector<int>& a) { int n = a.size(); for (int i

01-顺序表

瘦欲@ 提交于 2019-12-02 06:36:58
一、数据结构与算法   数据结构与算法是一个程序员的基本功,技术日月更新,但数据结构和算法就相当于一个人的内功,这个人在编程的造诣高不高,就要看内功深厚不深厚。数据结构与算法是一个程序员的基本功,需要平时不断去积累。生活中许多都设涉及到数据结构与算法,数据库就是很典型的,只有认识到数据结构与算法,才能够从底层开发出轮子,让大家直接用轮子去造车子。 1、顺序表   将一组元素看成一个序列,元素在序列的位置和顺序。这样的一组序列元素的组织形式,我们可以抽象为 线性表 。   根据线性表的 实际存储方式 ,分为两种实现模型:        1、顺序表 :将元素顺序地存放在一块连续的存储区,元素间的顺序关系由它们的存储顺序自然表示。        2、链表 :将元素存放在通过连接构造起来的一系列存储快中。 2、顺序表的基本形式    内存:   由上图可知内存的基本单位是字节,而一字节占位8。内存存储的本质是存储二进制数据,如何让计算机分辨出存储的数据是各自的类型,int类型占4个字节,即上图的连续的4个内存单元。char类型占1个字节,即内存的一个单元。   图a表示顺序表的基本形式,数据元素是连续存储,每个元素所占的存储单元大小固定相同(同类型数据)元素的下标是逻辑地址,而元素的物理地址(实际内存地址,即在内存中的实际地址)可以通过存储区的起始地址L 0 加上逻辑下标与存储单元的大小

关于描述算法复杂度的一些说明

早过忘川 提交于 2019-12-02 06:35:06
描述算法复杂度时,常用o(1), o(n), o(logn), o(nlogn)表示对应算法的时间复杂度,是算法的时空复杂度的表示。不仅仅用于表示时间复杂度,也用于表示空间复杂度。 O后面的括号中有一个函数,指明某个算法的耗时/耗空间与数据增长量之间的关系。其中的n代表输入数据的量。 比如时间复杂度为O(n),就代表数据量增大几倍,耗时也增大几倍。比如常见的遍历算法。再比如时间复杂度O(n^2),就代表数据量增大n倍时,耗时增大n的平方倍,这是比线性更高的时间复杂度。比如冒泡排序,就是典型的O(n^2)的算法,对n个数排序,需要扫描n×n次。 再比如O(logn),当数据增大n倍时,耗时增大logn倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)。二分查找就是O(logn)的算法,每找一次排除一半的可能,256个数据中查找只要找8次就可以找到目标。 O(nlogn)同理,就是n乘以logn,当数据增大256倍时,耗时增大256*8=2048倍。这个复杂度高于线性低于平方。归并排序就是O(nlogn)的时间复杂度。 O(1)就是最低的时空复杂度了,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。 哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)

Redis 有序集合

旧时模样 提交于 2019-12-02 06:13:32
#结构 key score value #集合和有序集合 都是没有重复元素、集合是无序的 、集合是element而有序集合是element+score #列表和有序集合 列表可以有重复元素、列表是有序的、列表是element #有序集合中的排名是从小到大的排序的 #重要API #添加score和element 返回添加元素的数量 zadd key score element(可以是多对) #时间复杂度是O(logN) #删除元素 zrem key element(可以是多对) #时间复杂度是O(1) #返回元素的分数 zscore key element #时间复杂度是O(1) #增加或减少元素的分数 zincrby key increScore element #时间复杂度是O(1) #返回有序集合的中元素个数 zcard key #时间复杂度是O(1) #返回指定元素的排名 zrank key element #时间复杂度是O(1) #返回指定索引范围内的升序元素[分值] zrange key start end [withscore] #时间复杂度是O(log(n)+m) n指的是集合的个数 m指的是索引范围 #返回指定分数范围内的升序元素[分值] 包括最大值和最小值 zrangebyscore key minscore maxscore [withscore]

【算法总结】图论算法(最小生成树和最短路)

瘦欲@ 提交于 2019-12-02 05:42:28
最小生成树和最短路算法   是很久以前就学过的东西。图论最基础的算法。通常在各种题目中担任题解的基础部分(这道题先跑个生成树再balabala)   这次也是复习了。 最小生成树   最小生成树是用来解决用最小的代价用N-1条边连接N个点的问题。常用的算法是Prim和Kruskal,两者时间复杂度并没有差很多(Prim堆优化的前提下),但是因为写Prim就要手撕堆所以我比较偏向Kruskal。    没错我不会(can't)用sort以外的STL Prim   Prim 算法使用和 Dijkstra 相似的蓝白点思想,用 dis 数组来表示 i 点与白点相连的最小权值,每一轮取出 dis 最小的蓝点,将其变为白点并修改与其相连的蓝点的 dis 值。    n 次循环,每次循环 Prim 算法都能让一个新的点加入生成树,n 次循环就能把所有点囊括到其中;每次循环 Prim 算法都能让一条新的边加入生成树,n-1 次循环就能生成一棵含有 n 个点的树;每次循环 Prim 算法都取一条最小的边加入生成树,n-1 次循环结束后,我们得到的就是一棵最小的生成树。这就是 Prim 采取贪心法生成一棵最小生成树的原理。   朴素Prim的时间复杂度是O(n²),显然的可以使用堆优化来获得更好的时间复杂度。 Kruskal   Kruskal 算法先将所有点认为是孤立的,然后将边按权值排序

网上摘抄-编码规范

倾然丶 夕夏残阳落幕 提交于 2019-12-02 04:51:01
摘抄自 https://juejin.im/post/5daf08cd6fb9a04e19506704 一、迭代entrySet() 获取Map 的key 和value 当循环中只需要获取Map 的主键key时,迭代keySet() 是正确的;但是,当需要主键key 和取值value 时,迭代entrySet() 才是更高效的做法,其比先迭代keySet() 后再去通过get 取值性能更佳。 反例: 正例: 二、使用Collection.isEmpty() 检测空 使用Collection.size() 来检测是否为空在逻辑上没有问题,但是使用Collection.isEmpty() 使得代码更易读,并且可以获得更好的性能;除此之外,任何Collection.isEmpty() 实现的时间复杂度都是O(1) ,不需要多次循环遍历,但是某些通过Collection.size() 方法实现的时间复杂度可能是O(n) 反例: 正例: 三、初始化集合时尽量指定其大小 尽量在初始化时指定集合的大小,能有效减少集合的扩容次数,因为集合每次扩容的时间复杂度很可能时O(n),耗费时间和性能。 反例: 四、使用StringBuilder 拼接字符串 一般的字符串拼接在编译期Java 会对其进行优化,但是在循环中字符串的拼接Java 编译期无法执行优化,所以需要使用StringBuilder 进行替换

ECUST_Algorithm_2019_2

旧城冷巷雨未停 提交于 2019-12-02 03:47:00
简要题意及解析 1001 \(N\) 个数分为 \(K+8\) 组,每组三个,记为 \((a,b,c)\) ,方便起见要求 \(a \leq b \leq c\) ,每组的代价是 \((a-b)^2\) ,总代价为每组的代价之和。求最小的总代价。 将所有物品 \(a[i]\) 从小到大排序,从后向前递推。 \(f[i][j]\) 表示在第 \(i\) 个到第 \(N\) 个数中选 \(j\) 组的最小代价。 \(f[i][j]=\min_{N-i+1 \leq 3 \times j} \{f[i+2][j-1]+(a[i+1]-a[i])^2\}\) 时间复杂度 \(O(Tnk)\) \(T\) 为数据组数, \(n\) 为物品个数, \(k\) 为所需组数。 1002 给出三个字符串 \(A,B,C\) ,问从 \(A\) 和 \(B\) 中按照与原顺序抽取一些字符,能不能组成 \(C\) 。 \(f[i][j]\) 表示从 \(A\) 的前 \(i\) 个和 \(B\) 的前 \(j\) 个中随意抽取,最多能组成 \(C\) 的前几位。 \(f[i][j]=\max\{f[i-1][j]+1(if~~A[i]==C[f[i-1][j]+1]),f[i][j-1]+1(if~~B[j]==C[f[i][j-1]+1])\}\) 时间复杂度 \(O(Tnm)\) \(T\)

程序员必须掌握的核心算法有哪些?

邮差的信 提交于 2019-12-02 03:20:36
分析《幸运飞艇五码两期高手牛计划》包赢技巧 专业导师一对一教导Q裙:802197 由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过不错的文章给大家。大家也可以留言区补充。 一、算法最最基础 1、时间复杂度 2、空间复杂度 一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。 文章推荐: 算法分析神器—时间复杂度 二、基础数据结构 1、线性表 列表(必学) 链表(必学) 跳跃表(知道原理,应用,最后自己实现一遍) 并查集(建议结合刷题学习) 不用说,链表、列表必须,不过重点是链表。 三分钟基础数据结构:如何轻松手写链表? 以后有面试官问你「跳跃表」,你就把这篇文章扔给他 2、栈与队列 栈(必学) 队列(必学) 优先队列、堆(必学) 多级反馈队列(原理与应用) 特别是优先队列,再刷题的时候,还是经常用到的,队列与栈

React Diff算法一览

孤者浪人 提交于 2019-12-02 02:24:33
前言 diff算法一直是React系统最核心的部分,并且由于演化自传统diff,使得比较方式从O(n^3)降级到O(n),然后又改成了链表方式,可谓是变化万千。 传统Diff算法 传统diff算法需要循环比较两棵树,所有节点的循环,那么单纯比较次数就是O(n^2),n*n P L A A / \ / \ / \ / \ B D ====> D B / \ C C 刷刷刷,每次都需要循环遍历,于是有以下的查找过程: PA->LA PA->LB PA->LC PA->LD PB->LA ... 除了查找过程消耗了O(n^2)之外,找到差异后还要计算最小转换方式,最终结果为O(n^3)。 所以,传统的diff算法的时间复杂度为O(n^3)。 如果React运用这种算法,那么节点过多,将会有大量的开销,虽然CPU的秒速达到30亿次计算,但依旧是非常耗费性能的。 有没有什么方式可以降低时间复杂度呢? 于是,React15对传统的diff做了一些限制,使得时间复杂度变为了O(n)。 React 15的Diff算法 《深入React技术栈》这本书,给出了三种Diff策略分析,文字描述太过抽象,直接表述如下: Tree diff、Component diff、Element diff Tree diff 什么是Tree diff?先上图: 首先,进行同级比较,并非循环比较

数据结构导论1

感情迁移 提交于 2019-12-02 00:44:24
数据结构(Data structure) 是计算机组织数据和存储数据的方式; 是指一组相互之间存在一种或多种特定关系的数据的组织方式和他们在计算机里面存储的方式以及定义在该组数据上的一组操作。 计算机解决问题的步骤 1. 数据的逻辑结构 是指数据及其数据的组织方式。 2.数据结构、算法和程序的关系 算法+数据结构 = 程序 (1976年瑞士计算机科学家尼克劳斯·维尔特[Niklaus Wirth]提出) 1.简单来说,数据结构是计算机组织数据和存储数据的方式。 2.1976年瑞士计算机科学家Niklaus Wirth曾提出一个著名公式 程序 = 算法+数据结构 基本概念和术语 数据(Data):所有能被计算机处理的符号的集合。 数据元素(Data Element):是数据这个集合中的一个个体即数据的基本单位。 数据项(Data Item):数据元素常常还可以分为若干的数据项,数据项是数据具有意义的最小单位。 数据,数据元素,数据项构成了数据组织的3个层次。 数据库中,数据项又称为字段/域。 它是数据得不可分割得最小标识单位。 实际问题中的数据称为原始数据。 逻辑结构 指数据元素之间的结构关系。 物理结构/存储结构 指数据结构在机内的表示 物理结构/存储结构 物理结构(Physical Structure)/存储结构 指数据结构在机内的表示,数据的逻辑结构在计算机中的实现。