复杂度

数据结构和算法-面试题

为君一笑 提交于 2020-02-23 03:02:20
########################################## """ 数据结构: 1,用Python代码简单实现一个栈。实现pop/push及max方法,要求能在O(1)时间内取得最大值。 排序算法: 写个快速排序热热身,分析一下复杂度,如果不使用额外的空间,应该怎么写?快排平均复杂度多少,最坏情况如何优化; 请列举常见排序并通过代码实现任意三种。冒泡/选择/插入/快排 几种常用排序的算法复杂度是多少; 单向链表如何使用快速排序算法进行排序; 查找算法: 用Python实现一个二分查找的函数。 请列举常见查找并通过代码实现任意三种。无序查找/二分查找/插值查找 如何遍历一个内部未知的文件夹(两种树的优先遍历方式) 算法复杂度 手写:一个长度n的无序数字元素列表,如何求中位数,如何尽快的估算中位数,你的算法复杂度是多少; 手写:已知一个长度n的无序列表,元素均是数字,要求把所有间隔为d的组合找出来,你写的解法算法复杂度多少; list,dict和数据结构和算法 1,Python中的列表是如何实现的?Python中的列表使用了分离式技术实现的动态顺序表。 2,Python中列表的索引查询的时间复杂度是多少?O(1) 3,dict与list的查找复杂度?dict用hash实现,查找的时间复杂度是O(1),list则为O(n)。 """ ##############

基础知识概要

家住魔仙堡 提交于 2020-02-20 19:29:21
1.算法复杂度——O记号,Ω符号,θ符号 T(n)=O(f(n)) iff c>0,当 n足够大时,有T(n)<c*f(n)T(n)=Ω(f(n)) iff c>0,当 n足够大时,有T(n)>c*f(n)T(n)=θ(f(n)) iff c1c2>0,当 n足够大时,有c1*f(n)>T(n)>c2*f(n) 2.复杂度类型 1)常数复杂度——O(1):效率最高 2)对数复杂度——O(logn):lnN,lgN,log,这类算法非常有效,复杂度无限接近于常数,logN=O(N^c) 3)多项式复杂度——O(n^c): 4)线性复杂度——O(n):所有O(n)类函数 5)指数复杂度——O(a^n):这类算法计算成本增长极快,通常被认为不可忍受 3.复杂度分析的主要方法: 迭代:级数求和 递归:递归跟踪+递推方程 猜测+验证 4.封底估算 1天=24hr*60min*60sec=25*4000=10^5sec 一生=一世纪=100yr*365=3*10^4day=3*10^9sec 三生三世=10^10sec 5.迭代和递归 计算任意n个整数之和 迭代:int sum=0;//O(1)for(int i=0;i<n;i++)//O(n) sum+=A[i];O(1) return sum;O(1)递归:return (n<1)?0:sum(A,n-1) +A[n-1]

最短路径问题

那年仲夏 提交于 2020-02-18 22:16:13
图论中的经典问题:给一个图,求出起点到终点的最短路径。 Graph Representation adjacency matrix i/j 0 1 2 3 4 0 \(\infty\) -1 4 \(\infty\) \(\infty\) 1 \(\infty\) \(\infty\) 3 2 2 2 \(\infty\) \(\infty\) \(\infty\) \(\infty\) \(\infty\) 3 \(\infty\) 1 5 \(\infty\) \(\infty\) 4 \(\infty\) \(\infty\) \(\infty\) -3 \(\infty\) 用 vector<vector<int>> g(n, vector<int>(n, INF)) 表示, g[i][j] 表示从顶点 \(i\) 到顶点 \(j\) 的权重,空间复杂度 \(O(|V|^2)\) ,适用于稠密图,用的不多; adjacency list 链表比较少用,基本都用动态数组: 0 (1,-1) (2,4) - - - 1 (2,3) (3,2) (4,2) - - 2 - - - - - 3 (1,1) (2,5) - - - 4 (3,-3) - - - - 用 vector<vector<pair<int, int>>> g 表示, g[i][j].first 表示从顶点 \

01-复杂度1 最大子列和问题 (20分)

一个人想着一个人 提交于 2020-02-18 13:04:42
给定 K个整数组成的序列{ N ​ 1 ​​, N ​ 2 ​​, ..., N ​ K ​​ },“连续子列”被定义为{ N ​ i ​​, N ​ i + 1 ​​, ..., N ​ j ​​ },其中 1。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。 本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:与样例等价,测试基本正确性; 数据2:102个随机整数; 数据3:103个随机整数; 数据4:104个随机整数; 数据5:105个随机整数; 输入格式: 输入第1行给出正整数 K ( ≤);第2行给出 K个整数,其间以空格分隔。 输出格式: 在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。 输入样例: 6 -2 11 -4 13 -5 -2 输出样例: 20 1 #include <iostream> 2 using namespace std; 3 int main(){ 4 int k; 5 cin>>k; 6 int arr[100005]; 7 long long max=0,now=0; 8 long long a,b,c; 9 for(int i

数据结构笔记

回眸只為那壹抹淺笑 提交于 2020-02-17 11:29:17
目录 数据结构 二叉搜索树 线段树 动态开点 线段树的合并 线段树优化建图 做法 例题 并查集 按秩合并 二分图判定 字典树 用字典树解决异或问题(01Trie) 字符串hash 双hash 进制hash 如何得到一个字符串所有子串的hash st表 倍增 lca转换为RMQ问题 tarjan算法离线求lca 一个复杂度的证明 非旋转treap即可持久treap 数据结构 二叉搜索树 递归定义 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 •维护一个集合,支持操作:插入、删除、查找 •方法:建立一棵有序的二叉树,每个结点对应集合中一个元素。 •满足性质:结点u的左子树的结点权值都比u小,右子树的结点权值都比u大。 •插入、删除、查找只需在二叉树中按照权值往下走即可。 可能的问题: 可能退化成一条链(例如如果按升序插入),那么每次操作平均复杂度O(n)需要一些技巧让二叉搜索树保持平衡。STL中的set和map都是平衡的二叉搜索树。noip一般情况下够用。 线段树 护区间信息的数据结构 每个结点对应一个序列的区间 完全二叉树,左子树为左一半区间,右子树为右一半 单点/区间修改。 动态开点 例题 维护一个数据结构

LeetCode 23 Hard,K个链表归并

一世执手 提交于 2020-02-17 09:04:02
本文始发于个人公众号: TechFlow ,原创不易,求个关注 链接 Merge k Sorted Lists 难度 Hard 描述 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 给定K个有序链表,要求将它所有的元素归并到一个链表,并且有序。 样例: Input: [ 1->4->5, 1->3->4, 2->6 ] Output: 1- >1->2->3->4->4->5->6 题解 按照惯例,我们还是先来看最简单的解法,也就是暴力法。 暴力 这题当中,暴力的方法也很简单,非常简单粗暴,那就是先把所有元素取出来,排序之后再放到链表当中去。但是这么做说实话有点脱裤子放屁,我们分析一下复杂度也会发现,假设所有的元素个数是n,那么最后的复杂度应该就是排序所消耗的复杂度,也就是 \(O(nlogn)\) ,和K没有一点关系,而且我们也完全没有用上这K个链表当中的元素都是有序的这个信息,显然这是不科学的。 我们对上面的纯暴力方法稍稍做一些优化,想办法把K个链表当中元素有序的信息用上。用上的方法也很简单,我们之前做归并排序的时候曾经做过两个数组的归并,我们用同样的方法,只不过我们这次换成是K个链表而已。也就是说我们每次遍历这K个链表的头元素

复杂度分析(上):如何分析、统计算法的执行效率和资源消耗?

烈酒焚心 提交于 2020-02-15 19:32:17
大 O 这种复杂度表示方法只是表示一种变化趋势。我们通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级就可以了。所以,我们在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那一段代码就可以了。这段核心代码执行次数的 n 的量级,就是整段要分析代码的时间复杂度。 加法法则:总复杂度等于量级最大的那段代码的复杂度 总的时间复杂度就等于量级最大的那段代码的时间复杂度 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积 来源: https://www.cnblogs.com/lakeslove/p/12313165.html

【DS】排序算法之希尔排序(Shell Sort)

让人想犯罪 __ 提交于 2020-02-13 02:00:14
一、算法思想 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1)插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率; 2)插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位; 我们将数组中两个元素之间的距离称为Gap,相邻元素之间的Gap自然是1,很明显的,插入排序的算法在调节元素的时候,Gap是1,这就造成了上面讲的低效的原因2)。因此希尔排序的思想如下: 1)假设序列的元素个数是n,选取一个初始Gap的d(d<n); 2)将序列中元素之间距离(即Gap)为d的元素分为一组,在每组之间直接进行插入排序; 3)全部完成以后,缩小Gap至d1(d1<d),然后继续2)直到Gap为1; 常见的Gap序列如下: 1)希尔原本的Gap:N/2、N/4、...1(反复除以2) 2)Hibbard的Gap:1、3、7、...、2k-1(k表示第几个gap) 3)Knuth的Gap: 1、4、13、...、(3k - 1) / 2(k表示第几个gap) 4)Sedgewick的Gap: 1、5、19、41、109、... 二、算法示意图 如图所示,展示了分组和排序的过程。第一行是分组的过程,总共有8个元素,Gap为8/2=4,标记为相同颜色的元素为一组

2.10日自学成果

有些话、适合烂在心里 提交于 2020-02-10 20:32:40
软件内在特性: 复杂度:没有两个软件的部分是相同的,软件不存在重复的部分。软件实体的扩展会导致软件元素一非线性递增的方式交互,软件必然会越来越复杂。复杂度不仅导致技术产生苦难,还引发了很多管理上的问题。因为管理者越来越难以完整的理解问题。 一致性:软件领域不存在像物理学那样“对于事物简化的解释”,软件的复杂度是随心所欲、毫无规则所言的。 可变性:软件的修改成本相对于汽车、建筑要低很多。软件产品扎根于文化母体中,例如用户、社会规律、计算机硬件等。后者不断变化要求了前者也要跟着变。 不可见性:软件客观上不具有抽象模型,这种缺憾限制了个人的设计过程,也阻止了思路互相之间的交流。 来源: https://www.cnblogs.com/sunhongbin/p/12292369.html