时间复杂度

常用算法(冒泡、插入、选择、快速)和二叉树详解

浪子不回头ぞ 提交于 2020-04-08 13:59:31
  同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。   计算机科学中,算法的 时间复杂度 是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号(Order)表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。 定义   在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。 算法复杂度   算法复杂度分为时间复杂度和空间复杂度。其作用: 时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。 时间复杂度   1. 一般情况下,算法的基本操作重复执行的次数是模块n的某一个函数f(n),因此,算法的时间复杂度记做:T(n)=O(f(n)) 分析:随着模块n的增大,算法执行的时间的增长率和 f(n) 的增长率成正比,所以 f(n) 越小,算法的时间复杂度越低,算法的效率越高。   2.

P4933 大师 题解

我们两清 提交于 2020-04-06 22:02:03
CSDN同步 原题链接 简要题意: 求一个数列中有多少个等差子序列。(子序列 不一定连续 ,子串 一定连续 ) 注:公差可以是负数。 算法一 对于 \(30 \%\) 的数据, \(n \leq 20\) . 显然,枚举子序列,然后暴力验证。 时间复杂度: \(O(2^n \times n)\) . 实际得分: \(30pts\) . 算法二 对于 \(60 \%\) 的数据, \(n \leq 100\) , \(v \leq 2 \times 10^3\) . 枚举等差数列前 \(2\) 项,然后算出公差,往后枚举即可。 时间复杂度: \(O(n^3)\) . 实际得分: \(60pts\) ~ \(100pts\) .(取决于程序常数) 算法三 对于另外 \(20 \%\) 的数据,所有电塔的高度构成一个等差数列。 显然,这时答案就相当于在 \(1\) ~ \(n\) 中取等差数列。 为什么呢?这时,只要取等差数列 \(x, x+y , x+y \cdots x+ky\) ,则在 原数列 中对应的数列为: \[a_x , a_{x+y} \cdots a_{x+ky} \] 必然为等差数列,并且每个数列对应一个这样的 等差数列 。 那么,你用上面 \(60 \%\) 的暴力优化一下,枚举任意的两个点都可以形成等差数列,计算即可。 当然有一种特殊情况:即 \(a_i = a_j

你的代码写得规范吗?

狂风中的少年 提交于 2020-04-06 02:50:36
一、MyBatis 不要为了多个查询条件而写 1 = 1 当遇到多个查询条件,使用where 1=1 可以很方便的解决我们的问题,但是这样很可能会造成非常大的性能损失,因为添加了 “where 1=1 ”的过滤条件之后,数据库系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描) 以比较此行是否满足过滤条件,当表中的数据量较大时查询速度会非常慢;此外,还会存在SQL 注入的风险。 反例: <select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer"> select count(*) from t_rule_BookInfo t where 1=1 <if test="title !=null and title !='' "> AND title = #{title} </if> <if test="author !=null and author !='' "> AND author = #{author} </if> </select> 正例: <select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo"

redis问学(一)

ε祈祈猫儿з 提交于 2020-04-05 16:38:04
一、主从复制 1. redis主从机制了解么?怎么实现的? 答: 二、数据结构 1. Redis熟悉么,了解哪些数据结构? 答: 2. 红黑树了解么,时间复杂度?既然两个数据结构时间复杂度都是O(logN),zset为什么不用红黑树? 答: 来源: https://www.cnblogs.com/chendf/p/12636621.html

集合和映射(Set And Map)

牧云@^-^@ 提交于 2020-04-05 15:36:39
目录 集合 Set 基于二分搜索树实现集合 基于链表实现集合 集合的时间复杂度分析 映射 Map 基于链表实现映射 基于二分搜索树实现映射 映射的时间复杂度分析 leetcode上关于集合和映射的问题 集合 Set   Set是一种新的数据结构,类似于数组,但是不能添加重复的元素,基于Set集合的这个特性,我们可以使用Set集合进行客户统计和词汇统计等,集合中常用的方法如下: public interface Set<E> { void add(E e); //添加元素e,不能添加重复元素 boolean contains(E e); //当前集合中是否包含元素e void remove(E e); //删除元素e int getSize(); //获取当前集合中元素的个数 boolean isEmpty(); //判断当前集合是否为空 } 基于二分搜索树实现集合   现在让我们基于我们上章实现的二分搜索树,来实现集合中的常用操作,若你对二分搜索树还不了解,你可以先看我的上一篇文章: 二分搜索树(Binary Search Tree) 进行学习,基于二分搜索树实现的集合代码实现如下: public class BSTSet<E extends Comparable<E>> implements Set<E> { //基于二分搜索树实现集合 private BST<E> bst;

详解时间、空间复杂度(内含彩蛋~~)

一世执手 提交于 2020-04-04 18:42:45
目录 一、时间复杂度:执行算法所需要的计算工作量 (一)时间复杂度的理解 1.时间频度定义 2.(渐进)时间复杂度定义 (二)时间复杂度的计算 计算攻略: 常见的算法时间复杂度由小到大排序: 大O表示法推导实例: 1.常数阶 ⇒ O(1) 2.线性阶 ⇒ O(n) 3.平方阶 ⇒ O(n2) 二、 空间复杂度:执行这个算法所需要的内存空间 三、彩蛋 学习算法我们首先需要清楚的概念就是 时间复杂度 和 空间复杂度 接下来我们就详细讲解一下时间复杂度和空间复杂度,为大家后面的学习打好基础! 算法入门书籍挑选点这里~ 帮你快速找到适合自己的算法书籍(详细,内含彩蛋哦~) 一、时间复杂度:执行算法所需要的计算工作量 (一)时间复杂度的理解 1.时间频度定义 我们需先明白: 一个 算法花费的时间 是与 算法中语句的执行次数 成 正比 的 (也就是说一个算法中语句执行次数越多,花费的时间也就越多) 时间频度:T(n): 一个算法中的语句执行次数,记为T(n) 2.(渐进)时间复杂度定义 T(n): 算法中基本操作重复执行的次数是问题规模n的某个函数。 f(n): 某个辅助函数 算法的(渐进)时间复杂度O(f(n)): 若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f (n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。 记作T(n)=O(f(n)),称O(f(n

STL容器的适用情况

荒凉一梦 提交于 2020-04-03 22:05:39
转自 http://hsw625728.blog.163.com/blog/static/3957072820091116114655254/ /*--> */ /*--> */ 一.各种容器的特性 vector 典型的序列容器, C++ 标准严格要求次容器的实现内存必须是连续的,唯一可以和标准 C 兼容的 stl 容器,任意元素的读取、修改具有常数时间复杂度,在序列尾部进行插入、删除是常数时间复杂度,但在序列的头部插入、删除的时间复杂度是 O(n) ,可以 在任何位置插入新元素,有随机访问功能,插入删除操作需要考虑。 deque 序列容器,内存也是连续的,和 vector 相似,区别在于在序列的头部插入和删除操作也是常数时间复杂度 , 可以 在任何位置插入新元素,有随机访问功能。 list 序列容器,内存是不连续的,任意元素的访问、修改时间复杂度是 O(n) ,插入、删除操作是常数时间复杂度 , 可以 在任何位置插入新元素。 set 关联容器,元素不允许有重复,数据被组织成一棵红黑树,查找的速度非常快,时间复杂度是 O(logN) multiset 关联容器,和 set 一样,却别是允许有重复的元素,具备时间复杂度 O(logN) 查找功能。 map 关联容器,按照 { 键,值 } 方式组成集合,按照键组织成一棵红黑树,查找的时间复杂度 O(logN) ,其中键不允许重复。

算法

笑着哭i 提交于 2020-03-31 16:07:16
一、算法复杂度 #什么是算法复杂度: 算法在编写成可执行程序后,运行时所需要的资源,资源包括时间资源和内存资源 #一个算法的评价  (衡量代码的好坏)     1、时间复杂度  (运行时间)   2、空间复杂度  (占用空间 ) 1.1时间复杂度 1、时间频度, 一个算法执行所消耗的时间,从理论上是不能算出来的,必须上机测试才知道,但我们不可能对每个算法都上机测试,只需要知道哪个算法花费的时间多,哪个算法花费的时间少就可以了,并且一个算法花费的时间与算法语句中语句执行数成正比,哪个算法中语句执行次数多,它花费的时间就多, #一个算法中语句执行次数称为语句频度或时间频度,记为T(n) #算法的时间复杂度是指,执行算法所需要的计算工作量 2、时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),存在一个正常数c使得fn*c>=T(n)恒成立。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。 在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n^2

4L-线性表之数组

假装没事ソ 提交于 2020-03-30 15:06:21
关注公众号 MageByte,设置星标点「在看」是我们创造好文的动力。后台回复 “加群” 进入技术交流群获更多技术成长。 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素。 你一定会说数组这么简单,有啥说的。嘿嘿嘿,里面包含的玄机可不一定每个人都知道。 今天的疑惑来了….. 数组几乎都是从 0 开始编号的,有没有想过 为啥数组从 0 开始编号,而不是从 1 开始呢? 使用 1 不是更符合人类的思维么? 数组简介 数组是一种线性表数据结构,用一组连续的内存空间来存储一组具有相同类型的数据。 里面出现了几个重要关键字,线性表、连续内存空间和相同类型数据,这里解释下每个关键词的含义。 线性表 就是数据排成像线一样的结构,就像我们的高铁 G1024 号,每节车厢首尾相连,数据最多只有「前」和「后」两个方向。除了数组,链表,队列,栈都是线性结构。 非线性表 比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。 连续的内存空间 正式由于它具有连续的内存空间和相同的数据类型的数据。就有一个牛逼特性:「随机访问」。很多人面试的时候一定被问数组与链表有什么区别?多数会回答 “链表适合插入、删除,时间复杂度 O(1);数组适合查找,查找时间复杂度为 O(1)”。

数据结构、算法及线性表总结

℡╲_俬逩灬. 提交于 2020-03-28 19:23:14
··· //初始化表 void InitList(SqList *&L) { L=new SqList;//为线性表分配空间 L->length=0; } //销毁线性表 void DestoryList(SqList* &L) { delete L;//释放L指向的内存空间 } //获取元素 bool GetElem(SqList *L,int i,ElemType &e) { if(i<1||i>L->length) return false; e=L->data[i-1]; return true; } //插入元素 bool ListInsert(SqList *&L,int i,ElemType e) { if(i<1||i>L->length) return false; i--; for(int j=L->length;j>i;j--) L->data[j] = L->data[j-1]; L->data[i]=e; L->length++; return true; } //删除元素 bool LiseDelete(SqList *&L,int i,ElemType &e) { if(i<1||i>L->length) return false; i--; e=L->datd[i]; for(int j=i;j<L->length-1;j++) L->data[j]