时间复杂度

数据结构----数组

白昼怎懂夜的黑 提交于 2019-12-04 19:06:20
数组:内存中开辟的连续的、有序的空间 动态数组时间复杂度 动态数组的扩容 reSize,涉及到数组的复制,时间复杂度为O(n) 添加操作:O(n)     addFirst() 不扩容,则单纯的将所有元素后移O(n) ,若扩容, reSize O(n) + 元素后移 O(n) =2O(n) -->O(n)     addLast() 不扩容,则为O(1),扩容 O(n) -->O(n)     add(Index,e) 不扩容,去index为size/2,则O(n/2)--> -->O(n)   最终动态数组的add时间复杂度为O(n) 移除操作O(n)     removeFirst() 不扩容,则单纯的将所有元素前移O(n) ,若扩容, reSize O(n) + 元素后移 O(n) =2O(n) -->O(n)     removeLast() 不扩容,则为O(1),扩容 O(n) -->O(n)     remove(Index,e) 不扩容,去index为size/2,则O(n/2)--> -->O(n) 修改操作:O(1) 查询     get(Index),根据索引查询,则为O(1) (已知索引) contains(e)/find(e) 则为O(n)      (未知索引) 以上操作均为最坏情况分析,但是不可能每次操作都涉及扩容,所以总以最坏情况分析并不是完全合理的。

『嗨威说』算法设计与分析 - PTA 程序存储问题 / 删数问题 / 最优合并问题(第四章上机实践报告)

风流意气都作罢 提交于 2019-12-04 18:47:50
本文索引目录: 一、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  问题描述:        题意是,题干给定磁盘总容量和各个文件的占用空间,询问该磁盘最多能装几个文件。   1.3  算法描述:        签到题,只需要将各个文件从小到大排序,并拿一个变量存储已占用的容量总和,进行对比即可得到结果。 #include<bits/stdc++.h> #include<algorithm> using namespace std; #define MAXLENGTH 1000 int interger[MAXLENGTH]; int main() { int num,length; int sum = 0; int counter = 0; int m = 0;

算法第四章上机实践报告

江枫思渺然 提交于 2019-12-04 18:23:15
1.实践题目:    程序存储问题 2.问题描述:   设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 3.算法描述:    因为要尽可能装在更多的程序,所以贪心算法的选择基准为程序在磁带上的长度,优先选择长度短的程序。 ①贪心选择性质: 设程序已经参照长度从小到大排序,(x1, x2, ..., xn)是程序储存问题的一个最优解,设k = min(1<=i<=n) {i | xi = 1},如果给定的程序存储问题有解,则1<=k<=n。 当k = 1时,(x1, x2, ..., xn)是一个满足贪心选择性质的最优解。 当k > 1时,取y1 = 1,yk = 0,yi = xi,1<i<=n,i≠k,则(n∑i=1)liyi = l1 - lk + (n∑i=1)lixi <= (n∑i=1)lixi <= L 因此,(y1, y2, ..., yn)是所给程序存储问题的可行解。此外,由(n∑i=1)yi = (n∑i=1)xi知,(y1, y2, ..., yn)是满足贪心选择性质的最优解。所以,程序存储问题具有贪心选择性质。 ②最优子结构性质: 设

【转载】常见十大经典排序算法及C语言实现【附动图图解】

白昼怎懂夜的黑 提交于 2019-12-04 18:22:48
原文链接: https://www.cnblogs.com/onepixel/p/7674659.html 注意 : 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描述信息,后面会持续更新本文。 0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度: 是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 0.4 在线学习 这里提供两个算法可视化网站,方便理解这些排序算法: https://visualgo.net/en/sorting https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html

算法第四章实践题

僤鯓⒐⒋嵵緔 提交于 2019-12-04 18:12:57
一、实践题目 程序存储问题:设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。 输出格式: 输出最多可以存储的程序数。 输入样例: 在这里给出一组输入。例如: 6 50 2 3 13 8 80 20 输出样例: 在这里给出相应的输出。例如: 5 二、问题描述 通过合理地选择安排程序,使长度一定磁带上存储尽可能多的程序,求最多可以存储的程序数。 三、算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质) #include<iostream> #include<algorithm> using namespace std; int a[10001]; int main() { int n; cin >> n; int L; cin >> L; for(int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a+n); int in = 0; int count = 0

第四章上机实践报告

扶醉桌前 提交于 2019-12-04 18:10:20
实践题目   程序存储问题 问题描述   设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 算法描述(说明你的贪心策略,并且参考会场安排问题,利用反证法证明贪心选择和最优子结构性质)    将输入的n个程序长度从小到大排列,要使得磁带上可以存储最多的程序,则应该先把短的程序先放进去,直到放进去的程序最大程度的填满磁带。   假设最优子结构中不包含最短的程序,那么磁带剩余的空间必定小于包含最短程序的,则可存放剩余的程序也会变少,故每次挑选最短的程序放入为最优子结构。 算法时间及空间复杂度分析(要有分析过程)    两个for循环时间复杂度为O(n),sort排序的时间复杂度为O(nlogn),故该算法时间复杂度为O(nlogn)。   空间复杂度为O(n)。 心得体会(对本次实践收获及疑惑进行总结    贪心算法很多时候是靠第一感觉判断问题的做法,但更多的时候应该做更周全的考虑。 来源: https://www.cnblogs.com/zttt/p/11874837.html

数据结构 -- wk1 基本概念(2)

泄露秘密 提交于 2019-12-04 14:16:47
第一讲 基本概念 - 2 2019-11-15  算法(Algorithm)  一个 有限指令集  接受一些 输入 (有些情况下不需要输入)  产生 输出  一定在 有限步骤 之后终止 [不可像操作系统那样,一直运行]  每一条 指令 必须  有充分明确的目标,不可以有歧义  计算机能处理的范围之内  描述应不依赖于任何一种计算机语言以及具体的实现 例一:选择排序的伪码描述 * List 是数组 还是 链表? * Swap 是函数 还是 宏?-- 这些都由 具体的算法 决定 Part 1 - 算法的 空间复杂度 S(n) 和 时间复杂度 T(n) 1) 空间复杂度 S(n) 根据算法写成的程序在执行时 占用存储单元 的长度。 这个长度往往与输入数据的规模有关。[N] 空间复杂度 过高 的算法可能导致使用的 内存超限 ,造成程序 非正常中断 。 2) 时间复杂度 T(n) 根据算法写成的程序在执行时 耗费时间 的长度。 这个长度往往也与输入数据的规模有关。 时间复杂度 过高 的低效算法可能导致我们在 有生之年 都 等不到运行结果 。 *对之前的递归算法 [见 基本概念-1 例一]  N=100000; 1 // recursion 2 void printN(int N){ 3 if(N){ 4 printN(N-1); 5 printf("%d\n", N); 6

排序与搜索

我的未来我决定 提交于 2019-12-04 11:25:13
排序与搜索 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法。 排序算法的稳定性 稳定性 :稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。 当相等的元素是无法分辨的,比如像是整数,稳定性并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。 (4, 1) (3, 1) (3, 7)(5, 6) 在这个状况下,有可能产生两种不同的结果,一个是让相等键值的纪录维持相对的次序,而另外一个则没有: (3, 1) (3, 7) (4, 1) (5, 6) (维持次序) (3, 7) (3, 1) (4, 1) (5, 6) (次序被改变) 不稳定排序算法可能会在相等的键值中改变纪录的相对次序,但是稳定排序算法从来不会如此。不稳定排序算法可以被特别地实现为稳定。作这件事情的一个方式是人工扩充键值的比较,如此在其他方面相同键值的两个对象间之比较,(比如上面的比较中加入第二个标准:第二个键值的大小)就会被决定使用在原先数据次序中的条目,当作一个同分决赛。然而,要记住这种次序通常牵涉到额外的空间负担。 一、冒泡排序 冒泡排序 (英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列

顺序表

断了今生、忘了曾经 提交于 2019-12-04 11:21:58
顺序表 在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。 对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系。 这样的一组序列元素的组织形式,我们可以将其抽象为 线性表 。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,在实际程序中应用非常广泛,它还经常被用作更复杂的数据结构的实现基础。 根据线性表的实际存储方式,分为两种实现模型: 顺序表 ,将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示。 链表 ,将元素存放在通过链接构造起来的一系列存储块中。 一、顺序表的基本形式 图a表示的是顺序表的基本形式,数据元素本身连续存储,每个元素所占的存储单元大小固定相同,元素的下标是其逻辑地址,而元素存储的物理地址(实际内存地址)可以通过存储区的起始地址Loc (e0)加上逻辑地址(第i个元素)与存储单元大小(c)的乘积计算而得,即: Loc(ei) = Loc(e0) + c*i 故,访问指定元素时无需从头遍历,通过计算便可获得对应地址,其时间复杂度为O(1)。 如果元素的大小不统一

NOIP2017 时间复杂度 大模拟

旧街凉风 提交于 2019-12-04 10:46:34
再写一道大模拟题。 由于是限时写的,相当于考场代码,乱的一批。 题目链接: P3952 时间复杂度 先记几个教训: 字符串形式的数字比较大小老老实实写函数,字典序都搞错几次了 栈空的时候不但pop()会RE,top()访问栈顶也会RE 数字以字符形式读入要考虑位数超过一位 思路: 1.我用的是在线做法。 2.使用结构体存储一个循环体,包括变量名、起始与结束、是否与n有关、是否能够进入(这一点麻烦了,在栈里推入是否与n有关以及是否能够进入就行了) 3.使用一个变量存储当前进入的层数(只记含n的),当压入一个“与n有关”时++,当弹出一个“与n有关”时--,取最大值 4.使用一个bool存储当前循环是否能进入。当弹出一个不能进入的结构体时取消“不能进入”的状态(如果已在“不能进入”的状态,结构体不会被记作“不能进入”) 源码: //MiserWeyte is now "mzWyt" #include <bits/stdc++.h> using namespace std; int n, tgt, rel, curr = 0, maxx; bool used[30]; string tar; bool err, notin; struct sts{ char tpe, nam; string sta, end; bool use, nin; }; bool le(string a,