算法复杂度

Graham算法

守給你的承諾、 提交于 2020-01-15 07:24:19
前言:本菜鸡的第一篇算几,记录一下我有多菜 Graham算法 一种凸包算法,扫描部分的时间复杂度为 O ( n ) \mathcal{O}(n) O ( n ) ,总的时间复杂度 O ( n l o g n ) \mathcal{O}(nlogn) O ( n l o g n ) 原理:从点集中先找出一个最左下方的点,易证这个点肯定在凸包上,然后以这点为极点,将所有点根据与这点的极角进行排序,并且同时使用一个栈结构维护凸包上的点。按照极角序依次将当前点与栈顶的两个点作拐向判断:若右拐,则将当前点加入栈中,否则将栈顶点弹出。当点集遍历完之后,还在栈中的点就是凸包上的点。 算法步骤 对所有点进行排序,选择 x x x 坐标最小的点作为极点,即找到第一个一定在凸包上的点 bool cmp1 ( const Pnt & a , const Pnt & b ) { return a . x != b . x ? a . x < b . x : a . y < b . y ; } 将其余所有点按照极角排序,在极角相同的情况下比较与极点的距离,按极角序依次处理每一个点 inline bool cmp2 ( const Pnt & st , const Pnt & ed ) { //按极角排序 int del = p [ st ] * p [ ed ] ; if ( del != 0 )

算法导论笔记(一):复杂度,分治,随机

做~自己de王妃 提交于 2020-01-07 18:59:15
示例与概念 插入排序 归并排序 最坏情况分析与平均情况分析 函数增长的渐进记号 (O(n)) 表示函数增长的上界。即,花费时间不会高于线性增长。 (Theta(n)) 同时表示上界和下界。即,花费时间一定是这个线性增长的。 (Omega(n)) 表示增长的下界。 (o(n)) 表示不渐进紧确的上界。如, (2n =O(n^2)) , (n^2=O(n^2)) , (2n=O(n^2)) ,但 (n^2neq o(n^2)) (omega(n)) 与 (o(n)) 类似,表示不紧确的下界。 此外,常用 (T(n)) 表示所需的实际时间的函数。 分析分治算法,以归并排序为例 归并排序最坏运行时间的递归式: [ T(n)=begin{cases}Theta(1)&text{若} n=1,\ 2T(n/2)+Theta(n)&text{若} n>1. end{cases} ] 除使用主定理外,还可以这样理解递归式的值:将递归过程看做一个二叉树。递归调用中的每一层的总代价均为 (cn) ,其中 (c) 为常数。而二叉树的层数应为 (log_2n+1) 。故,整个算法的代价期望为 (Theta(nlog_2n)) 。 分治法 分治法求最大和的子数组 分解。将数组划分为两个子数组。此时,只存在三种子数组: 全部位于中点左侧的子数组 全部位于中点右侧的子数组 跨越中点的子数组 解决

算法导论笔记(一):复杂度,分治,随机

落爺英雄遲暮 提交于 2020-01-04 00:10:49
示例与概念 插入排序 归并排序 最坏情况分析与平均情况分析 函数增长的渐进记号 (O(n)) 表示函数增长的上界。即,花费时间不会高于线性增长。 (Theta(n)) 同时表示上界和下界。即,花费时间一定是这个线性增长的。 (Omega(n)) 表示增长的下界。 (o(n)) 表示不渐进紧确的上界。如, (2n =O(n^2)) , (n^2=O(n^2)) , (2n=O(n^2)) ,但 (n^2neq o(n^2)) (omega(n)) 与 (o(n)) 类似,表示不紧确的下界。 此外,常用 (T(n)) 表示所需的实际时间的函数。 分析分治算法,以归并排序为例 归并排序最坏运行时间的递归式: [ T(n)=begin{cases}Theta(1)&text{若} n=1,\ 2T(n/2)+Theta(n)&text{若} n>1. end{cases} ] 除使用主定理外,还可以这样理解递归式的值:将递归过程看做一个二叉树。递归调用中的每一层的总代价均为 (cn) ,其中 (c) 为常数。而二叉树的层数应为 (log_2n+1) 。故,整个算法的代价期望为 (Theta(nlog_2n)) 。 分治法 分治法求最大和的子数组 分解。将数组划分为两个子数组。此时,只存在三种子数组: 全部位于中点左侧的子数组 全部位于中点右侧的子数组 跨越中点的子数组 解决

简单介绍算法以及算法分析

妖精的绣舞 提交于 2019-12-18 06:22:45
(1)算法的五个特征:有穷性,确定性,可行性,可输入,可输出; (2)算法设计的四个要求:正确性,可读性,健壮性,效率和低存储要求; (3)算法效率的度量方法: (1)事后统计法: 缺点; 一是必须先运行算法编制的程序,二是所得时间统计量依赖于计算机的硬件,软件等因素; (2)事前分析估算法; (5)时间复杂度:算法所需存储空间的量度; 时间复杂度的比较:O(1)<O(long2n)<O(n)<O(n log2n)<O(n^3) 来源: https://www.cnblogs.com/gzh666666/p/10940150.html

开发中常见的算法汇总一览

心已入冬 提交于 2019-12-07 22:00:39
我们知道计算机中各类应用程序随处可见的,而支撑这些应用程序运行的就是各类数据结构以及各类算法,这就是经典等式 程序=数据结构+算法 ,上一篇幅中我们列举了一些常用的数据结构,那么今天我们来捋一捋日常开发中常见的一些算法思想以及具体算法各自的特性及相关指标 文章目录 常见算法思想 穷举法(Brute Force) 核心思想 特性 适用问题或算法 分治法(Divide and Conquer) 核心思想 特性 适用问题或算法 贪心算法(Greedy) 核心思想 特性 适用问题或算法 动态规划法(Dynamic Programming) 核心思想 特性 适用问题或算法 回溯法(Backtracking) 核心思想 特性 适用问题或算法 分枝界限法(Branch and Bound) 关于递归(画外音) 贪心和动态规划(画外音) 常见的算法分类 排序算法 冒泡排序 插入排序 希尔排序 选择排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 排序算法总结 查找算法 顺序查找 二分查找 散列查找 二叉树查找 搜索算法 树的层次遍历 树的(前/中/后)序遍历 常见算法思想 我们首先介绍下几种常见的算法思想,日常中一些具体的解题算法的思想都依赖于它们,文中列举一些具体算法问题可以自行通过搜索引擎了解 穷举法(Brute Force) 核心思想 顾名思义就是列举出所有可能出现的情况

Algorithm lesson final exam

纵饮孤独 提交于 2019-12-05 18:10:25
1、algorithm analysis O B/W/AV/AMOR,混入其他问题,设计+分析 2、传统算法(肯定要考) 1)divide and conquer master therem、 recursive tree、分析复杂度、递归树加起来得到最终结果 2)greedy algorithm example sort->select 拟阵 独立系统的贪心模板,直接得到近似比 3)dynamic programming sub-optimal structrue、编辑距离 3、graph algorithm 1)exproration bfs and dfs、最小生成树 2)最短路,single path all pair 负环、负边 3)max-flow 优化方式 4、turing machine Np/NPC NP-hard np-reduction 5、approximation greedy/sequential/local search/lp rouding 三种算法的设计、图算法、图灵机、近似算法 来源: https://www.cnblogs.com/elpsycongroo/p/11939165.html

动画图解:十大经典排序算法动画与解析,看我就够了!(配代码完全版)

倾然丶 夕夏残阳落幕 提交于 2019-12-03 09:37:36
排序算法是《数据结构与算法》中最基本的算法之一。 排序算法可以分为 内部排序 和 外部排序 。 内部排序是数据记录在内存中进行排序。 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。 用一张图概括: 时间复杂度与空间复杂度 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序; O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。 关于稳定性: 稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。 不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。 1. 冒泡排序 1.1 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 1.2 动画演示 冒泡排序动画演示 1.3 参考代码 1// Java 代码实现 2public

面试心得 --- 金山云-大数据开发面试20180628

匿名 (未验证) 提交于 2019-12-03 00:38:01
1.算法 一组无序数组,和一个Num。求两个数相加和等于Num的下表, 但要求时间复杂度是O(n)。 解法:Hash 2.软件建构: Hadoop AM挂了,会有什么机制? MapReduce shuffle,源码级别的过程? Hue 怎么更好的控制权限? Sentry + hue Spark Spark的任务数是怎么确定的? https://blog.csdn.net/u012965373/article/details/80847543 总结:后台数据管理建议多看源码。感谢这位不知名的面试官,让我有了学习的方向。 文章来源: 面试心得 --- 金山云-大数据开发面试20180628

快速排序

不想你离开。 提交于 2019-12-02 12:20:50
**快速排序** 快速排序的基本思想: 首先选第一个数作为分界数据, 将比它小的数据存储在它的左边,比它大的数据存储在它的右边,它存储在左、右两个子集之间。 这样左、右子集就是原问题分解后的独立子问题。 再用同样的方法,继续解决这些子问题,直到每个子集只有一个数据,就完成了全部数据的排序工作。 利用快速排序算法的思想,来解决选择问题。 记一趟快速排序后,分解出左子集中元素个数为 nleft,则选择问题可能是以下几种情况之一: nleft =k﹣1,则分界数据就是选择问题的答案。 nleft >k﹣1,则选择问题的答案继续在左子集中找,问题规模变小了。 nleft <k﹣1,则选择问题的答案继续在右子集中找,问题变为选择第k-nleft-1 小的数,问题的规模变小了。 此算法在最坏情况时间复杂度为 O(n2) ,此时nleft总是为0,左子集为空,即第k小元素总是位于right子集中。 平均时间复杂度为 O(n )。 int select (int left, int right, int k){ if(left>=right) return a[left]; int i=left; int j=right+1; int pivot=a[left]; while(true){ do{ i=i+1;}while(a[i]<pivot); do{ j=j-1;}while(a[j]

数据结构框架

纵饮孤独 提交于 2019-12-02 03:46:55
程序=算法+数据结构 时间复杂度: 加入随着问题规模n的增长,算法执行的时间增长率和f(n)的增长相同,则记作T(n)=o(f(n),称T(n)为算法的时间复杂性   频度统计法:以语句执行次数的多少作为评判标准   渐进复杂度:f(n)=2n 3 +3n 2 +2n+1=>f(n)=o(n 3 ) f(n)=o[g(n)] //g(n)为f(n)的阶    求时间复杂度:找到基本算法---->频度 O(log 2 n)<O(n)<O(nlog 2 n)<O(n 2 )<O(n 3 )<....<O(2 n )<O(3 n )<O(n!) //省略号后的为 不可用算法 来源: https://www.cnblogs.com/code-fun/p/11729765.html