时间复杂度

1.引入概念

a 夏天 提交于 2019-12-01 04:52:03
数据结构与算法(Python) Why? 我们举一个可能不太恰当的例子: 如果将最终写好运行的程序比作战场,我们码农便是指挥作战的将军,而我们所写的代码便是士兵和武器。 那么数据结构和算法是什么?答曰:兵法! 我们可以不看兵法在战场上肉搏,如此,可能会胜利,可能会失败。即使胜利,可能也会付出巨大的代价。我们写程序亦然:没有看过数据结构和算法,有时面对问题可能会没有任何思路,不知如何下手去解决;大部分时间可能解决了问题,可是对程序运行的效率和开销没有意识,性能低下;有时会借助别人开发的利器暂时解决了问题,可是遇到性能瓶颈的时候,又不知该如何进行针对性的优化。 如果我们常看兵法,便可做到胸有成竹,有时会事半功倍!同样,如果我们常看数据结构与算法,我们写程序时也能游刃有余、明察秋毫,遇到问题时亦能入木三分、迎刃而解。 故,数据结构和算法是一名程序开发人员的必备基本功,不是一朝一夕就能练成绝世高手的。冰冻三尺非一日之寒,需要我们平时不断的主动去学习积累。 通过三天的学习,我们希望让大家能理解其概念,掌握常用的数据结构和算法。 引入 先来看一道题: 如果 a+b+c=1000,且 a^2+b^2=c^2(a,b,c 为自然数),如何求出所有a、b、c可能的组合? 1.1 第一次尝试 1 import time 2 3 start_time = time.time() 4 5 #

对分治法思想的体会及结对编程情况汇报

我只是一个虾纸丫 提交于 2019-12-01 02:37:13
对分治法思想的体会:   简单来说分治法就是对一个规模大的问题进行分解,得到规模更小的若干个子问题,对子问题单独求解并合并子问题答案得到原问题答案的解决问题的思想。   其实分治法思想已在大一所学习的算法中有所体现,如二分搜索,但二分搜索规律简单,我并没有在其中体会到分治思想的妙处。但后来通过用分治思想解决求最大连续子段和、大整数的乘法运算、矩阵乘法、棋盘覆盖、线性时间选择等复杂问题时,我实在地体会到分治思想在解决有规律、大规模问题上的妙处。再者,归并排序、快速排序这些时间复杂度较低的排序方法也是运用了分治思想,可见分治思想的广泛运用。   对于使用者来说,可以结合对时间复杂度的考虑来决定是否该使用分治算法。如分治法能将二分搜索的时间复杂度降至O(logn),使求最大连续字段和的时间复杂度为O(nlogn),大整数乘法为O(n^1.59),而规避排序和快速排序的平均时间复杂度为O(nlogn)。   并不是所有的问题都适合用分治思想解决,由原问题分解得到的子问题必须能合并为原问题 的解才能使用分治法。如果分解得到的子问题不是相互独立的,使用分治法可能不能达到降低时间复杂度的目的。 结对编程的情况汇报:   就本次结对编程,我们在协作过程中发现双方的编程习惯和对题目的理解方式不同,在讲解自己的代码时不能让对方理解,还需时间磨合并加强沟通。进度较缓

数组和链表

試著忘記壹切 提交于 2019-12-01 02:18:54
数组和链表的区别 数组静态分配内存,链表动态分配内存; 数组在内存中连续,链表不连续; 数组元素在栈区,链表元素在堆区; 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n); 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。 注: 通常:1、基本数据类型(整数类型:byte、short、int、long;浮点数类型:float、double;布尔类型:boolean;字符类型:char;) 变量, 2、一个对象的引用, 3、函数调用的现场保存 栈空间; 4、而通过new关键字和构造器创建的对象放在堆空间; 5、程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中 6、栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间。 来源: https://www.cnblogs.com/mww-NOTCOPY/p/11647438.html

分治算法体会

落爺英雄遲暮 提交于 2019-12-01 01:41:13
分治算法体会: 分治算法的概念: 所谓分治就是将一大问题,分解成一个一个小问题,而这些小问题的合并解得到局部问题的解,最后层层合并,最终得到问题的解。每个子问题都是相同的(解决思路是一致的),才能用分治; 分治有时候用于缩小所需查找的数值范围 常见的使用分治的算法: 归并排序 二分查找 最大字串和(也可以用动态规划) 何时使用: 分治的时间复杂度一般为:logn级,当题目中要求时间为logn,或者nlogn时间复杂度时,可以考虑使用分治。 来源: https://www.cnblogs.com/aresjohnson/p/11646248.html

NOIp初赛题目整理

寵の児 提交于 2019-12-01 00:21:50
NOIp初赛题目整理 这个 blog 用来整理扶苏准备第一轮 csp 时所做的与 csp 没 有 关 系 的历年 noip-J/S 初赛题目,记录了一些我从不知道的细碎知识点,还有一些憨憨题目,不定期更新。 1、(07senior,5) 在C 语言中,表达式 \(23~\mid~2~\land^~5\) 的值是( ) ​ A. \(23\) B. \(1\) C. \(18\) D. \(32\) E. \(24\) Answer:A Solution:这题一看就是要考运算符优先级来着。在 \(C\) 语言中, 按位与大于按位异或大于按位或 ,这里的大于指优先级大于,优先级越大越优先计算,因此计算过程为 \(2~\land~5~=~7\) 。然后计算 \(23~\mid~7 = 23\) 。 需要指出的是,左右移的优先级大于上述三个运算,因此 \(C\) 语言表达式 1 | p << 1 是先算 p << 1 ,再对 \(1\) 取或,例如 \(1~\mid~3~<<~1\) 的答案是 \(9\) 。 2、(07senior,12) 与十进制数 \(17.5625\) 对应的 \(8\) 进制数是( )。 ​ A. \(21.5625\) B. \(21.44\) C. \(21.73\) \(D.21.731\) Answer:B Solution:这里介绍一下分数的进制转换

时间复杂度 空间复杂度

假如想象 提交于 2019-11-30 19:26:23
一、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当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)) 为算法的渐进时间复杂度,简称时间复杂度。 在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。 按数量级递增排列,常见的时间复杂度有: 常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O

模拟测试61

只谈情不闲聊 提交于 2019-11-30 19:18:57
T1:   直接模拟。   记录当前位置及朝向,暴力累加即可。   但是每次memset可能会T,只能记录经过的点,然后一个一个清。   时间复杂度$O(nk)$。 T2:   rvalue学长的题解很好。   链接一下Lockey大神的题解: 这里 。 T3:   将操作视为一个字符串,可以用hash做,然后就是简单的线段树区间加和区间乘。   乘法标记的优先级大于加法标记,乘法标记下传时更新加法标记。   时间复杂度$O(nlogn)$。 来源: https://www.cnblogs.com/hz-Rockstar/p/11636437.html

洛谷P3952 时间复杂度

╄→尐↘猪︶ㄣ 提交于 2019-11-30 18:35:24
题目 先判断是否有解,然后开两个栈,分别存进入递归时间复杂度为O(1)的变量,和时间复杂度为O(n)的变量,最后取最大值。 #include <bits/stdc++.h> using namespace std; int T; int tong[1000100]; stack <int> s, s2; int main() { // freopen("Time.txt", "w", stdout); scanf("%d", &T); while (T--) { memset(tong, 0, sizeof(tong)); while (s.size()) s.pop(); int L, flag = 0, F1 = 0, E1 = 0, ans = 0, now = 0; string TI;//flag为2则不进入 cin >> L >> TI; int len = TI.size(); if (TI[2] == '1') ans = 0; else for (int i = 4; i < len; i++) { if (TI[i] >= '0' && TI[i] <= '9') ans = ans * 10 + TI[i] - '0'; } for (int i = 1; i <= L; i++) { char c1; cin >> c1; if (c1 == 'F') {

【acwing板子大全】图论与搜索

早过忘川 提交于 2019-11-30 18:19:48
树与图的遍历 时间复杂度 O(n+m), n表示点数,m表示边数 (1) 深度优先遍历 —— 模板题 AcWing 846. 树的重心 int dfs(int u){ vis[u]=1; int son_size=1,now=0; ee(i,u){ int v=e[i].v; if(!vis[v]){ int t=dfs(v); now=max(now,t); son_size+=t; } } now=max(now,n-son_size); ans=min(ans,now); return son_size; } (2) 宽度优先遍历 —— 模板题 AcWing 847. 图中点的层次 queue<int>q; inline void spfa(){ mem(dis,0x3f); mem(vis,0); q.push(1); vis[1]=1; dis[1]=0; while(!q.empty()){ int u=q.front();q.pop(); vis[u]=0; ee(i,u){ int v=e[i].v,w=e[i].w; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } 拓扑排序 —— 模板题 AcWing 848. 有向图的拓扑序列 时间复杂度 O(n

算法跟数据结构的入门

﹥>﹥吖頭↗ 提交于 2019-11-30 18:13:21
什么是算法   算法的五个特征:有穷性,确定性,可行性,有输入,有输出   算法的设计原则:正确性,可读性,健壮性bug/高效率与低存储。内存+cpu内存占用最小。   评价算法的两个重要指标:时间复杂度(运行一个程序花费的时间),空间复杂度(运行程序所需要的内存 OOM 一般就是找数组容器等)。     1.常数性时间复杂度0(1)      及运行代码:            2.线性性0(m)            线性性 O(m)            3.       对数性 nlog(n) 快速排序            4.           平方性            5.     时间复杂度优化标准就是:尽量往低的优化 , 一般在程序中找 for while 递归等就能大概算出时间复杂度 。     以上几个性能对比 :O(1)>O(n)>O(nlogn)>O(n^2) 什么是数据结构     数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。   基础数据结构     1.数组     元素之间可以快速的随机访问     每个元素都必须是连续的,当需要扩容时,就需要将已有的数据复制到已有的存储空间     ArrayList:使用最多的数据结构,访问快