时间复杂度

数据结构与算法之比较排序算法总结

喜欢而已 提交于 2020-03-13 14:53:32
介绍: 比较算法大致可以分为两种,一种为比较算法,另一种为非比较算法。 比较算法有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序,希尔排序。 非比较算法有:计数排序,基数排序,桶排序。 https://gitee.com/linqiankun/Utils/tree/v3.0/ 时间复杂度: 排序方法 最好情况 平均情况 最差情况 辅助空间 稳定性 冒泡排序 n n^2 n^2 1 yes 选择排序 n^2 n^2 n^2 1 no 插入排序 n n^2 n^2 1 yes 归并排序 nlogn nlogn nlogn n yes 堆排序 nlogn nlogn nlogn 1 no 快速排序 nlogn nlogn n^2 1 no 希尔排序 n^1.3 nlogn~n^2 n^2 logn~n no 比较算法: 冒泡排序 普通冒泡排序 冒泡排序是一种极为简单的排序算法。通过循环反复的遍历数组中的元素,依次比较相邻的两个元素。如果不满足排序规则,就进行位置交换,直到没有元素需要交换位置,排序完成。 这个算法会慢慢的使元素按照需要的顺序浮出来。 时间复杂度为:O(n)~O(n^2)~O(n^2) 冒泡排序运行顺序: 比较相邻元素,按照排序规则进行位置交换。 对每一对相邻元素进行第一步的操作,操作完之后,队伍最后会是满足条件的数。循环体的内层循环走完一圈。

转:经典ACM算法

孤街醉人 提交于 2020-03-13 07:16:46
实验一 统计数字问题 实验二 最大间隙问题 实验三 众数问题 实验四 半数集问题 实验五 集合划分问题 实验六 最少硬币问题 实验七 编辑距离问题 实验八 程序存储问题 实验九 最优服务次序问题 实验十 汽车加油问题 实验十一 工作分配问题 实验十二 0-1背包问题 实验十三 最小重量机器设计问题 实验十四 最小权顶点覆盖问题 实验十五 集合相等问题 实验十六 战车问题 实验一 统计数字问题 1、问题描述: 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。 2、题目分析: 考虑由0,1,2,…,9组成的所有n位数。从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为。 满足如下递归式: 由此可知,。 据此,可从低位向高位进行统计,再减去多余的0的个数即可。 3、算法设计: 定义数组a[10]存放0到9这10个数出现的次数,个位为第0位,第j位的数字为r。采用while循环从低位向高位统计: a. 统计从个位算起前j位0~9个数; b. 如果j+1位为0,去掉第j+1位补0个数; c. 统计第j+1位出现1~(r-1)个数; d.

转:经典ACM算法

荒凉一梦 提交于 2020-03-13 07:15:47
实验一 统计数字问题 实验二 最大间隙问题 实验三 众数问题 实验四 半数集问题 实验五 集合划分问题 实验六 最少硬币问题 实验七 编辑距离问题 实验八 程序存储问题 实验九 最优服务次序问题 实验十 汽车加油问题 实验十一 工作分配问题 实验十二 0-1背包问题 实验十三 最小重量机器设计问题 实验十四 最小权顶点覆盖问题 实验十五 集合相等问题 实验十六 战车问题 实验一 统计数字问题 1、问题描述: 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。 2、题目分析: 考虑由0,1,2,…,9组成的所有n位数。从n个0到n个9共有个n位数,在这些n位数中,0,1,2,…,9每个数字使用次数相同,设为。 满足如下递归式: 由此可知,。 据此,可从低位向高位进行统计,再减去多余的0的个数即可。 3、算法设计: 定义数组a[10]存放0到9这10个数出现的次数,个位为第0位,第j位的数字为r。采用while循环从低位向高位统计: a. 统计从个位算起前j位0~9个数; b. 如果j+1位为0,去掉第j+1位补0个数; c. 统计第j+1位出现1~(r-1)个数; d.

python数据结构与算法基础名词积累

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-12 01:47:23
记录: 算法,很早之前,我就知道是特别重要一环;但是,今天,看到一个简单例子,第一次被震撼了。 算法: 算法是独立存在的一种解决问题的方法和思想。 算法五大特性: 输入: 算法具有0个或多个输入 输出: 算法至少有1个或多个输出 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性:算法中的每一步都有确定的含义,不会出现二义性 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 大O记法: 对于单调的整数函数f,如果存在一个整数函数g和实常数c>0,使得对于充分大的n总有f(n)<=c*g(n),就说函数g是f的一个渐近函数(忽略常数),记为f(n)=O(g(n))。也就是说,在趋向无穷的极限意义下,函数f的增长速度受到函数g的约束,亦即函数f与函数g的特征相似。 时间复杂度: 假设存在函数g,使得算法A处理规模为n的问题示例所用时间为T(n)=O(g(n)),则称O(g(n))为算法A的渐近时间复杂度,简称时间复杂度,记为T(n)。 时间复杂度排序: 最优时间复杂度: 算法完成工作最少需要多少基本操作。 最坏时间复杂度: 算法完成工作最多需要多少基本操作。 平均时间复杂度: 算法完成工作平均需要多少基本操作。 时间复杂度的几条基本计算规则: 1.基本操作,即只有常数项,认为其时间复杂度为O(1)。 2.顺序结构

20200311_时间复杂度

南笙酒味 提交于 2020-03-11 12:24:52
20200311_时间复杂度 算法是编程中重要的一门技术,提到算法就一定会提到时间复杂度与空间复杂度。 衡量代码优秀的标准:运行时间、占用空间。 时间复杂度 时间复杂度是一个定性(确定性质而非精确量化)描述算法运行时间的函数。通常根据算法运行的元素操作数进行评估。 与空间复杂度。 分类:算法 参考文献: 时间复杂度_作者S_123789_20200311 计算算法的时间、空间复杂度_Jay54520 来源: CSDN 作者: ninja59k 链接: https://blog.csdn.net/gdnh22a/article/details/104790206

一些关于排序算法的总结

送分小仙女□ 提交于 2020-03-11 02:42:03
排序算法 平均时间复杂度 冒泡排序 O(n^2) 选择排序 O(n^2) 插入排序 O(n^2) 希尔排序 O(n^1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*logN) 基数排序 O(d(n+r)) ①冒泡排序(BubbleSort) 基本思想: 两个数比较大小,较大的数下沉,较小的数冒起来。 过程: 比较相邻的两个数据,如果第二个数小,就交换位置。 从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。 继续重复上述过程,依次将第2.3…n-1个最小数排好位置。 平均时间复杂度: O(n^2) java代码实现: public static void BubbleSort ( int [ ] arr ) { int temp ; //临时变量 for ( int i = 0 ; i < arr . length - 1 ; i ++ ) { //表示趟数,一共arr.length-1次。 for ( int j = arr . length - 1 ; j > i ; j -- ) { if ( arr [ j ] < arr [ j - 1 ] ) { temp = arr [ j ] ; arr [ j ] = arr [ j - 1 ] ; arr [ j - 1 ] = temp

最小的K个数

怎甘沉沦 提交于 2020-03-10 19:38:49
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 示例1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例2: 输入:arr = [0,1,2,1], k = 1 输出:[0] 限制: 0 <= k <= arr.length <= 10000 0 <= arr[i] <= 10000 这道题应该是比较常见的一个问题了,还有一个镜像问题是最大的K个数。总结之后,大概有如下几种解题思路: 1. 排序法 最容易想到的方法,直接按升序对原数组排序,然后输出前K个数即可。时间复杂度依赖于所使用的排序算法,快排为O(nlogn)。 class Solution { public : vector < int > getLeastNumbers ( vector < int > & arr , int k ) { sort ( arr . rbegin ( ) , arr . rend ( ) ) ; vector < int > ans ( arr . begin ( ) , arr . begin ( ) + k ) ; return ans ; } } ; 2. 维护一个最小堆 只需要前K个最小的数,而不需要对全部数组排序,因此自然而然就可以想到建立一个最小堆

缓存算法(页面置换算法)-FIFO、LFU、LRU

天大地大妈咪最大 提交于 2020-03-10 16:38:39
转自:http://www.cnblogs.com/dolphin0520/ 1.FIFO算法   FIFO(First in First out),先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单、且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中的队列即可实现。   在FIFO Cache设计中,核心原则就是: 如果一个数据最先进入缓存中,则应该最早淘汰掉 。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。在FIFO Cache中应该支持以下操作;    get(key):如果Cache中存在该key,则返回对应的value值,否则,返回-1;   set(key,value):如果Cache中存在该key,则重置value值;如果不存在该key,则将该key插入到到Cache中,若Cache已满,则淘汰最早进入Cache的数据。    举个例子:假如Cache大小为3,访问数据序列为set(1,1),set(2,2),set(3,3),set(4,4),get(2),set(5,5)   则Cache中的数据变化为:   (1,1) set(1,1)   (1,1) (2,2) set(2,2)   (1,1) (2,2) (3,3) set

数组、链表、栈、队列

▼魔方 西西 提交于 2020-03-09 19:01:51
数组 主要了解常用的基本操作以及对应的时间复杂度 数组、队列、集合、字典 链表 常用的单链表、双向链表、循环链表 常用的基本操作及其时间复杂度 Java源码分析 链表示例 java java 跳表 空间换时间 跳跃表 为什么使用跳表而不是红黑 LRU缓存机制 来源: CSDN 作者: 你家要不要小太阳 链接: https://blog.csdn.net/weixin_42051011/article/details/104751945

遇见的题目——关于时间复杂度

若如初见. 提交于 2020-03-09 18:02:34
在一个具有n个结点的有序单链表中插入一个新结点并仍然保持有序的时间复杂度是: 第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为Ο(n²),则整个算法的时间复杂度为Ο(n+n²)=Ο(n²)。   注、加法原则:T(n)=O(f(n))+O(g(n))=O(max(fn,gn))   常见的算法时间复杂度由小到大依次为:   Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n²)<Ο(n³)<…<Ο(2^n)<Ο(n!)<O(n^n) Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环语句,其时间复杂度就是Ο(1)。Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)和Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者是有效算法,把这类问题称为P类问题,而把后者称为NP问题。 来源: https://www.cnblogs.com/666wolaichaungmen/p/12449894.html