时间复杂度

转载:10大算法排序

末鹿安然 提交于 2019-11-26 18:21:57
https://www.cnblogs.com/onepixel/p/7674659.html 0 算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度: 是指算法在计算机 内执行时所需存储空间的度量,它也是数据规模n的函数。 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.1 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对

算法的笔记

元气小坏坏 提交于 2019-11-26 17:27:08
(Python)算法: 1.引入概念: 如果a+b+c=1000,且a^2+b^2=c^2(a,b,c为自然数),如何求出a,b,c的组合? 枚举法: 工作量太大,浪费时间 for a in range(0,1001): for b in range(0,1001): c = 1000-a-b if a**2+b**2=c**2: print('a,b,c:%d,%d,%d'%(a,b,c) #T(n)=n*n*(1+max(1,0))=n^2*2=O(n^2) #或者: for a in range(0,1001): for b in range(0,1001): for c in range (0,1001): if a+b+c=1000 and a**2+b**2=c**2: print('a,b,c:%d,%d,%d'%(a,b,c) #时间复杂度:T=1000*1000*1000*2 #T(n)=n**3*2 #T(n)=k* (n**a)函数的走势决定力量是n**a,而k是决定函数的陡峭,决定不了函数的走向 #渐进函数:T(n)=g(n)=n**a,g(n)大O表示法,忽略系数 算法: 解决问题的思路或方法,计算机处理信息的的本质,因为计算机本质上就是一个算法莱高速计算机确切的步骤来执行一个指定的任务,一般的,当计算机处理信息时,会从输入设备或者数据的存储地址读取数据

算法复杂度的计算

丶灬走出姿态 提交于 2019-11-26 17:05:11
算法的效率 既然算法是解决问题的描述,那么就像一千个人眼中有一千个阿姆雷特他大姨夫一样,解决同一个问题的办法也是多种多样的,只是在这过程中我们所使用/消耗的时间或者时间以外的代价(计算机消耗的则为内存了)不一样。为了更快、更好、更强的发扬奥利奥…哦不,提高算法的效率。所以很多时候一个优秀的算法就在于它与其他实现同一个问题的算法相比,在时间或空间(内存)或者时间和空间(内存)上都得到明显的降低。 所以呢,算法的效率主要由以下两个复杂度来评估: 时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。 空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。 设计算法时,时间复杂度要比空间复杂度更容易出问题,所以一般情况一下我们只对时间复杂度进行研究。一般面试或者工作的时候没有特别说明的话,复杂度就是指时间复杂度。 1.0 空间复杂度 一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。   (1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)

算法基础(Java)--八大排序算法

独自空忆成欢 提交于 2019-11-26 16:41:10
前言 为了巩固自己的算法能力,重学算法,一个一个自己写,敲。本文主要介绍Java八大排序经典算法。 1. 冒泡排序(BubbleSort) 1.1 基本思想 两个数比较大小,较大的数下沉,较小的数冒起来。 1.2 过程 1.3 算法实现 /** * @Description: 冒泡排序,优化版 平均时间复杂度:O(n^2) * @Date: 21:11 2019/8/7 * @Param: [arr] * @return: int[] */ static int [ ] BubbleSort ( int [ ] arr ) { boolean flag = false ; for ( int j = 1 ; j < arr . length ; j ++ ) { for ( int i = 0 ; i < arr . length - j ; i ++ ) { if ( arr [ i ] > arr [ i + 1 ] ) { int temp = arr [ i ] ; arr [ i ] = arr [ i + 1 ] ; arr [ i + 1 ] = temp ; flag = true ; } } if ( ! flag ) { break ; } } return arr ; } 2. 选择排序(SelctionSort) 2.1 基本思想

网络流算法//最大流//EK算法//dinic算法//最小(大)费用最大流(待续)

南笙酒味 提交于 2019-11-26 14:24:34
目录 最大流流算法 (EK算法) 时间复杂度 O(V*(E^2)) Dinic算法 时间复杂度O((V ^ 2) * E) 在洛谷题解中看到了一句很有启发的话:网络流善于解决各种有要求的匹配 联想到题目是匹配问题,且满足网络流要求的数据范围,可以尝试网络流 V是点的数目,E是边的数目 最大流流算法 (EK算法) 时间复杂度 O(V*(E^2)) 定义 : 我们有一个 源点(只有流出量) 和 汇点(只有流入量) 每条边有一个 流量 和 容量,流量最初为0,容量是题目告知我们的,我们要求的是 在所有边的 流量 <= 容量 && 每个点流入量 = 流出量 时,流入汇点的最大流是多少。 首先我们需要知道 残留网络 : 残留网络就是反向图的流量,我们正向遍历一个图,会走一条路径到汇点。 一条路径的 增广路 = min(经过的每条边的 {容量 - 当前流量} ) 但是我们这条边可能是反向的流,所以 正向边的容量 -= 增广路 反向边容量 += 增广路 找到增广路,我们就 flow += 增广路 当找不到增广路就结束了这个算法。 因为看了vector建图和链式前向星建图的效率和空间差异,就手动改了一下模板,不用常用的mp[][] 数组标记,练习一下链式前向星。不太懂的,这里看看 https://blog.csdn.net/castomere/article/details/80426485

时间复杂度和空间复杂度

心已入冬 提交于 2019-11-26 13:57:57
一般来说,计算机算法是问题规模n的函数f(n),算法的时间复杂度也因此记做T(n)=O(f(n)); 常见时间复杂度有:常数阶、线性阶、平方阶、立方阶、对数阶、nlog2n阶、指数阶 效率:O(1) > O(log2n)> o(n)> o(nlog2n) > o(n^2) > o(n^3) > o(2^n) > o(n!) > o(n^n) 算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡量不同算法之间的优劣呢? 主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。 因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是「鱼和熊掌」,不可兼得的,那么我们就需要从中去取一个平衡点。 下面我来分别介绍一下「时间复杂度」和「空间复杂度」的计算方式。 一、时间复杂度 我们想要知道一个算法的「时间复杂度」,很多人首先想到的的方法就是把这个算法程序运行一遍,那么它所消耗的时间就自然而然知道了。 这种方式可以吗?当然可以,不过它也有很多弊端。

【算法之常见的时间复杂度】 -- 2019-08-08 17:50:15

别等时光非礼了梦想. 提交于 2019-11-26 13:49:20
原文: http://106.13.73.98/__/116/ 补充 空间复杂度:用来评估算法占用内存大小的式子。 什么是算法? 算法(Algorithm):一个计算过程,解决文件的方法 时间复杂度 先总结 时间复杂度是用来评估算法运行时间的一个式子(单位)。 一般来说,时间复杂度高的算法比复杂度低的算法慢。 长安的时间复杂度(按效率排序): O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n2logn) < O(n3) 不常见的时间复杂度: O(n!) O(2n) O(nn) 对应的复杂度 下面这张图和上面这张一样,其复杂度不变。 不管for循环内执行多少代码,有x层for循环,复杂度就是O(nx)。 原文: http://106.13.73.98/__/116/ 来源: https://www.cnblogs.com/gqy02/p/11322688.html

排序算法

徘徊边缘 提交于 2019-11-26 13:19:10
算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 算法复杂度 相关概念 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度:是指算法在计算机 内执行时所需存储空间的度量,它也是数据规模n的函数。 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.1 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1~3,直到排序完成。 1.2 代码实现

十大经典排序算法的算法描述和代码实现

谁说胖子不能爱 提交于 2019-11-26 04:48:51
这里详细讲解了十大经典算法的分类,例如交换排序、插入排序、选择排序等比较类排序,以及计数排序、桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现。对冒泡排序、插入排序、选择排序和堆排序等十种算法进行了详细的思想总结。 一、算法概述 1、算法分类 十种常见排序算法可以分为两大类: (1)比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn)因此也称为非线性时间比较类排序。 (2)非比较类排序:不通过比较元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 2、算法复杂度 3、相关概念 (1)稳定 如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 (2)不稳定 如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 (3)时间复杂度 对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 (4)空间复杂度 是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 二、排序算法的代码实现 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成

插入排序

雨燕双飞 提交于 2019-11-26 02:39:35
一、基本思想 (直接插入排序) 1.把整个区间分为“有序”和“无序”。 2.每次选择无序区间内的第一个元素插入到有序区间的合适位置。 二、性能分析 选择排序是一种稳定性较好的算法。 空间复杂度为O(1)。 数据有序时,时间复杂度最好,O(N); 数据逆序时,时间复杂度最坏,O(N^2); 平均时间复杂度为O(N^2)。 插入排序的初始数据越接近有序,时间效率越高。 三、代码实现 //插入排序,升序为例 public static void insertSort ( int [ ] array ) { //bound变量来把整个数组分成两个区间 //[0, bound) 已排序区间 //[bound, size) 待排序区间 for ( int bound = 1 ; bound < array . length ; bound ++ ) { //bound 下标对应的元素就是待插入元素 //把这个元素放到前面的有序顺序表中的合适位置 int tmp = array [ bound ] ; int cur = bound - 1 ; for ( cur = bound - 1 ; cur >= 0 ; cur -- ) { if ( array [ cur ] > tmp ) { array [ cur + 1 ] = array [ cur ] ; } else { break ;