时间复杂度

04-1_线性表的操作

喜欢而已 提交于 2019-11-30 08:39:43
顺序表的操作 1. 增加元素 a. 尾端加入元素,时间复杂度为O(1) b. 非保序的加入元素(不常见),时间复杂度为O(1) # 在哪个位置插入元素,就把哪个位置的元素移到最后面,然后在该位置插入新元素 c. 保序的元素加入,时间复杂度为O(n) # 在哪个位置插入元素,就把该位置的元素和其后的所有元素,整体向后移动一位 2. 删除元素 a. 删除表尾元素,时间复杂度为O(1) b. 非保序的元素删除(不常见),时间复杂度为O(1) c. 保序的元素删除,时间复杂度为O(n) 来源: https://www.cnblogs.com/nichengshishaonian/p/11576093.html

时间复杂度

微笑、不失礼 提交于 2019-11-30 06:19:33
算法分析   一个算法的效率一般以执行时间来衡量。度量一段程序的执行时间有以下两种方式:    事后统计 :对一段程序多次执行,统计执行时间。    事前分析估算 :对算法程序的分析,估算算法大概执行时间。当然,估算的时间并不是一个具体的值,而是一个与n(n表示问题规模)有关的函数。   事后统计方式的缺陷很明显:一是需要等待程序执行,若程序过大,执行时间会较长。二是执行时间除了和算法有关之外,还与计算机的硬件、软件等环境因素相关,统计出来的数据不一定准确。所以一般使用事前分析估算算法的执行时间长短。 时间复杂度   一个语句的频度是指该语句重复执行的次数。一个算法的时间频度指的是算法中最大的语句频度,用T(n)表示。   例如,计算从1加到n的和: 1 public static int sum(int n) { 2 int sum = 0; 3 for (int i = 1; i <= n; i++) sum += i; 4 return sum; 5 } sum   对于这段程序而言,其时间频度T(n) = n + 1(语句“i <= n”的频度最大,重复执行了n + 1次)。 1 public static int sum(int n) { 2 return (1 + n) * n / 2; 3 } sum   对于这段程序而言,其时间频度T(n) = 1。   所以

牛客算法学习1

六月ゝ 毕业季﹏ 提交于 2019-11-30 06:12:38
title: 牛客算法学习part1 date: 2019-06-16 20:59:43 categories: 算法 tags: 1. 概念 1.1. 时间复杂度 1.2. 空间复杂度 1.3. 最优解 1.4. 排序的稳定性 2. 数组排序 2.1. 时间复杂度O(N^2),空间复杂度O(1) 2.1.1. 冒泡排序 2.1.2. 选择排序 2.1.3. 插入排序 2.2. 时间复杂度O(NlogN) 2.2.1. 归并排序 2.2.2. 快速排序 2.2.3. 堆排序 2.2.4. 桶排序 3. 延伸题型 3.1. 区别 3.1.1. merge与quick的区别 3.2. 归并延伸 3.2.1. 求小和 3.2.2. 降序对 3.3. 桶排序 3.3.1. 排序之后的相邻最大差值 1. 概念 1.1. 时间复杂度 概念 时间复杂度 为一个算法流程中, 常数操作数量的指标, 这个指标叫做O, big O.只要高阶项, 不要低阶项, 也不要高阶项系数, 剩下部分记为f(N), 时间复杂度为O(f(N)) 常数操作 完成操作的时间与数据量无关 例子 寻找数组(长度N)中最大值 变量max = 系统最小值, 遍历数组, 时间复杂度为O(N) 有序数组二分查找 时间复杂度为O(logN) 默认以2为底 两个有序数组寻找相同的部分, 长度为N, M 循环遍历两个数组 O(N * M)

『嗨威说』算法设计与分析 - 算法第二章上机实践报告(二分查找 / 改写二分搜索算法 / 两个有序序列的中位数)

送分小仙女□ 提交于 2019-11-30 05:55:49
本文索引目录: 一、PTA实验报告题1 : 二分查找   1.1  实践题目   1.2  问题描述   1.3  算法描述   1.4  算法时间及空间复杂度分析 二、PTA实验报告题2 : 改写二分搜索算法   2.1  实践题目   2.2  问题描述   2.3  算法描述   2.4  算法时间及空间复杂度分析 三、PTA实验报告题3 : 两个有序序列的中位数   3.1  实践题目   3.2  问题描述   3.3  算法描述   3.4  算法时间及空间复杂度分析 四、实验心得体会(实践收获及疑惑) 一、PTA实验报告题1 : 二分查找   1.1  实践题目:   1.2  问题描述:       这道题主要阐述,给你一段有序的数字序列(已经排好序了),并给出需要查找的数Value,利用二分查找发法找出Value所在的下标,以及查找过程中所比较的次数。   1.3  算法描述:     二分查找的定义:       二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。       折半查找要求 线性表必须采用顺序存储结构 ,而且表中元素 按关键字有序排列 。     二分查找的操作:       假如以本例的样例来说,具体操作流程如下:       首先得到了一段数字序列,存入空间Temp:       将这段Temp数组送入递归中

史上最全NOIP初赛知识点

偶尔善良 提交于 2019-11-30 04:21:53
CSP-J/S 第一轮知识点选讲 \(NOIP\) (全国青少年信息学奥林匹克竞赛)于2019年取消。取而代之的是由 \(CCF\) 推出的非专业级软件能力认证,也就是现在的 \(CSP-J/S\) 。作为一名于2019年1月入 \(OI\) 的蒟蒻 \(OIer\) ,没能参加 \(NOIP\) 是我一生的遗憾。但在遗憾之余,我不得不备战 \(CSP\) 的认证。而 \(CSP\) 非专业级认证的第一轮(也就是 \(NOIP\) 初赛)常常使某些大神 \(OIer\) (就是对基础知识不太了解)无缘复赛...所以今天来盘一下初赛知识点,顺带着自己也学习一下...... 信息学史及基本知识 一、信息学及计算机史 计算机的顶级奖项 :图灵奖 对信息科学做出突出贡献的大神 :图灵(所以才有个奖),冯 · 诺伊曼 中国获图灵奖的大神 :姚期智(清华就有姚班,就是以他的名字命名的) 世界第一台电子计算机 :埃尼阿克( \(ENIAC\) ),于1946年2月14日 (够虐狗的) 在美国宾夕法尼亚大学诞生。又被叫做电子管计算机。 二、关于编程 编程语言 :分两类:面向对象和面向过程。 高级语言和低级语言的区别 :高级语言需要编译运行,常数较大,运行速度慢。而低级语言常数极小,运行速度快。此外,高级语言更容易移植。 常见低级语言 :汇编 面向对象的高级语言 :C++,Java,EIFFEL

排序之直接插入排序学习笔记

我们两清 提交于 2019-11-30 01:38:58
每天虽然还是一如既往的早起,晚睡。但是自己好几天没有刷题, 没有看书了。每天都是在各个KTV,饭店,网吧穿梭。跟那些熟悉却略显陌生的老同学聊着自己近状······感谢老天,下了雨(估计要明天就下雪了)把我从各种酒场中救了出来。忽然感觉其实安静的学习才是一件最享受的事情。今天晚上看了一下排序,整理了一下自己的学习笔记。   插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。 直接插入排序基本思想 1.直接插入排序的基本思想 直接插入排序(Straight Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。 把a[i]插入到a[0],a[1],...,a[i-1]之中的具体实施过程为:先把a[i]赋值给变量t,然后将t依次与a[i-1],a[i-2],...进行比较,将比t大的元素右移一个位置,直到发现某个j(0<=j<=i-1),使得a[j]<=t或j为(-1),把t赋值给a[j+1]. 2、第i-1趟直接插入排序:  通常将一个记录R[i](i=2,3,

时间复杂度

廉价感情. 提交于 2019-11-29 23:35:24
时间复杂度(Time Complexity)定义: 一、时间频度: 一个算法执行所消耗的时间,从理论上是不能算出来的,必须上机运行测试才能知道。 但我们不可能也没有必要对每个算法都上机测试。 一个算法花费的时间与算法中语句执行次数成正比,哪个算法中语句执行次数多,它花费时间就多。 一个算法中的语句 执行次数 称为语句频度或者称为时间频度,表示为T(n),T表示时间,n表示问题的规模 二、时间复杂度:   有时我们想知道它的变化时呈现什么规律,想知道问题的规模,而不是具体的次数,此时引入时间复杂度。   一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示。   若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数 记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。        T(n)=O(f(n))   或者说:时间复杂度就是时间频度去掉低阶项和首项常数   注意:时间频度与时间复杂度是不同的,时间频度不同但时间复杂度可能相同。   比如:有三个算法的时间频度是:     T(n) = 100000n 2 + 10n + 6     T(n) = 10n 2 + 10n + 6     T(n) = n 2   

Java——二叉树的基础实现

旧城冷巷雨未停 提交于 2019-11-29 23:15:19
------------------------------------------------------------   在进行链表结构开发的过程中,会发现所有的数据按照首尾相连的状态进行保存,那么当要进行判断某个数据是否存在时,这种情况下他所面对的时间复杂度为“ O(n) ”,如果说现在它数据量小,性能上不会有太大的差异,而一旦保存的数据量大了,这个时候时间复杂度就会严重损耗程序的性能。因此,数据结构必须发生改变,应该尽可能的减少检索此树为出发点设计。现在可以利用二叉树来实现。   如果要想实现一棵树结构的定义,那么就需要去考虑数据的存储形式,在二叉树的实现之中,其基本的实现原理如下:   1|-取第一个数据为保存的根节点,小于等于根节点的数据要放在节点的左子树,而大于该节点的数据要放在该节点的右子树.   2|-如果要进行数据检索的话,此时就需要进行每个节点的判断。但是它的判断是区分左右的,所以不会是整个的结构.都进行判断处理,那么它的时间复杂度就是O(logn)   而对于二叉树而言,在进行数据获取的时候也有三种形式:前序遍历(根-左-右)、中序遍历(左-根-右)、后序遍历(左-右-根)。   3|-二叉树之中的数据删除操作是非常复杂的,因为在进行数据删除的时候需要考虑的情况是比较多的:      情况一:如果待删除节点没有子节点,那么直接删掉即可;      情况二

二叉树的算法时间复杂度

你离开我真会死。 提交于 2019-11-29 18:51:13
二叉搜索树,平衡二叉树,红黑树的算法效率 操作 二叉查找树 平衡二叉树 红黑树 查找 O(n) O(logn) Olog(n) 插入 O(n) O(logn) Olog(n) 删除 O(n) O(logn) Olog(n) Olog(n)怎么算出来的 在一个树中查找一个数字, 第一次在根节点判断,第二次在第二层节点判断 以此类推,树的高度是多少就会判断多少次 树的高度和节点的关系就是以2为底,树的节点总数n的对数 来源: https://www.cnblogs.com/geektcp/p/11526925.html

【面试】:数组和链表的区别

我与影子孤独终老i 提交于 2019-11-29 18:48:34
数组: 数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少或不插入和删除元素,就应该用数组。 链表: 链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。比如:上一个元素有个指针指到下一个元素,以此类推,直到最后一个元素。如果要访问链表中一个元素,需要从第一个元素开始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表数据结构了。 C++语言中可以用数组处理一组数据类型相同的数据,但不允许动态定义数组的大小,即在使用数组之前必须确定数组的大小。而在实际应用中,用户使用数组之前有时无法准确确定数组的大小,只能将数组定义成足够大小,这样数组中有些空间可能不被使用,从而造成内存空间的浪费。链表是一种常见的数据组织形式,它采用动态分配内存的形式实现。需要时可以用new分配内存空间,不需要时用delete将已分配的空间释放,不会造成内存空间的浪费。 (1) 从逻辑结构角度来看 a, 数组必须事先定义固定的长度