时间复杂度

Redis API

匿名 (未验证) 提交于 2019-12-03 00:44:02
redis-server # 使用默认配置 ps-ef I grep redis netstat-antpl I grep redis redis-cli-h ip-p port ping redis-server -p 6380 redis-server /path/to/conf daemonize 是否是守护进程(nolyes) port Redis 对外端口号 logfile Redis系统日志 dir Redis工作目录 config get * keys keys * key 后面可以使用正则表达式,但是一般推荐在生产环境中使用这个命令 bdsize 计算key的总数 exists 判断是否存在 存在就返回1,不存在就返回0 del key-value 删除指定的key-value 成功删除1 不存在0 expire expire key seconds 设置seconds秒后过期 ttl 查看剩余的过期时间 persist 去掉过期时间 -2 代表不存在 -1代表存在,但是没有设置过期时间 type type key 返回key的过期时间 上面的命令出了keys 是O(n),其他全都是O(1). 单线程为什么这么快? 1、纯内存2、非阻塞IO 3、避免线程切换和竟态消耗 一次只运行一次命令 拒绝长命令 缓存,分布式锁,计数器。 get key

我也不知道标题应该定为什么

匿名 (未验证) 提交于 2019-12-03 00:39:02
之前的排序都是基于比较的排序,而桶排序是基于数据状况的排序,这就比较麻烦了,虽然很快,可是分析数据状况是很繁琐的。桶排序 是可以实现稳定排序的。常用有两种实现,一种是计数排序,一种是基数排序 (最后一节)。 桶排序的扩展,排序后的最大相邻数差值问题。有N个数字,建立N+1个桶,最大的差值不可能来自一个桶中,只能来自相邻的桶中,这样就可以得到最大差值了。 用数组结构实现大小固定的队列和栈? 数组实现栈,通过一个指针变量指向下一个进入栈中的元素的位置就可以实现了。 用数组实现队列,有3个变量,一个是start,一个是end,一个是size,start和end没有关系,仅仅和size有关系,如果size大小等于0,就表示没有东西了,直接报错。如果size大小大于数组长度,说明已经满了,也就直接报错返回,都则就可以循环的使用start和end 。 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返 回栈中最小元素的操作。 【要求】 1.pop、push、getMin操作的时间复杂度都是O(1)。没说空间限制 2.设计的栈类型可以使用现成的栈结构。 设计两个栈,同时压入就可以了。弹出的时候同步弹出。如果栈顶元素比min的栈顶元素小,压入该元素,否则压入min栈的栈顶元素。 还有一种是,如果栈为空,min栈直接压入,否则,如果当前值小于等于min栈顶元素,就压入,否则不压入

常用的排序算法的时间复杂度和空间复杂度

匿名 (未验证) 提交于 2019-12-03 00:38:01
排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n 2 ) O(n 2 ) 稳定 O(1) 快速排序 O(n 2 ) O(n*log 2 n) 不稳定 O(log 2 n)~O(n) 选择排序 O(n 2 ) O(n 2 ) 稳定 O(1) 二叉树排序 O(n 2 ) O(n*log 2 n) 不一顶 O(n) 插入排序 O(n 2 ) O(n 2 ) 稳定 O(1) 堆排序 O(n*log 2 n) O(n*log 2 n) 不稳定 O(1) 希尔排序 O O 不稳定 O(1) 1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f

平面最近点对的分治做法及其证明

匿名 (未验证) 提交于 2019-12-03 00:34:01
2018.6.23 好久没写博客了,做了一道有趣的分治题,写个博客。 题目传送门: P1429 平面最近点对(加强版) 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 第一行:n;2≤n≤200000 接下来n行:每行两个实数:x y (0≤x,y≤10^9),表示一个点的行坐标和列坐标,中间用一个空格隔开。 仅一行,一个实数,表示最短距离,精确到小数点后面4位。 众所周知,这道题可以分治解决。我们可以对这n个点,以x坐标为第一关键字,y坐标为第二关键字排序。排序后,我们可以把这个点集等分成左右两部分。这样分割以后,所有有可能成为答案的点对就被分为了三部分――1.两个点都在左侧集合,2.两个点都在右侧集合,3.一个点在左侧集合、另一个点在右侧集合。 对于两个点在同一个集合的点对,我们可以递归求解。但对于两个点不在同一个集合的最近点对的求解,却是很棘手的。如果暴力在两侧枚举点然后求距离,时间复杂度就会退化为 O ( n 2 ) O ( n 2 ) ,分治就没有意义了。 其实在两侧暴力枚举点,会得到很多多余的信息。如果在分治处理左右两边的时候,已经求出的最近点对距离为d(d为左半集合答案 与 右半集合答案 的较小值),那么如果我们能确定左侧的一个点到右侧的任何一个点的距离一定大于d的话,那么这个点在枚举点的过程中是可以直接被忽略的。这样

FLOYD算法

匿名 (未验证) 提交于 2019-12-03 00:30:01
输入: n*n维矩阵l[ 1...n , 1...n ],以便对于有向图G({[ 1 , ...n },E)中的边(i,j)的长度为l[i,j] 输出: 矩阵 D,使得D[i,j]等于i到j的距离 步骤 ( ( ( dist(k)[i][j]的含义:允许中间顶点的序号最大为k时从vi到vj的最短路径长度。 dist(n-1)[i][j]就是vi到vj的最短路径长度。 时间复杂度分析: FLOYD算法的时间复杂度为 O(n^3); 文章来源: FLOYD算法

时间复杂度与空间复杂度

匿名 (未验证) 提交于 2019-12-03 00:26:01
算法的复杂度 : 首先,算法的 时间复杂度 与 空间复杂度 算法的复杂度 。 时间复杂度 : 计算函数语句总的执行次数与问题规模N的函数表达式。 一个算法的最坏情况的运行时间是在任意输入下的运行时间的上限。 对于某些算法,最坏的运行情况出现的比较频繁。 大体上看,平均情况与最坏情况的运行时间基本一样差。 O渐近表示法: 算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)=O(f(n)),它表示随问题规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,称O(f(n))为算法的渐近时间复杂度,即时间复杂度的O渐近表示法。 O(n)的一般计算方法: 5. 将留下的最高阶的系数换为1。 int x = 1 ; //时间复杂度为O(1) 1 for ( int i= 0 ; i<n; i++) { System. out .println(i); } //时间复杂度为O(N) 1 2 3 int n = 8 , count = 0 ;; for ( int i= 1 ; i<=n; i *= 2 ) { count ++; } //时间复杂度为O(logN) 1 2 3 4 int n = 8 , count = 0 ;; for ( int i= 1 ; i<=n; i++) { for ( int j= 1 ; j<=n; j++) {

HashMap 、HashTable、TreeMap、LinkedHashMap的对比区别

匿名 (未验证) 提交于 2019-12-03 00:22:01
1、 共同点 、 LinkedHashMap 、 HashTable 、 TreeMap 都实现了 Map 接口,用于存储键值对,根据键得到值,键是不能重复的。 2、 HashMap (1) 键可以为空 (2) 不是线程安全 如果有两个并发线程同时对 HashMap 进行修改,则会抛出异常: [java] view plain copy 如果要实现线程安全,可以采用 [java] view plain copy (3) 存储方式 KEY 放在数组的同一个单元的一个链表中。 jdk1.7及以前:数组+链表,查询的时间复杂度O(n) jdk1.8:数组+链表/红黑树,当链表的长度大于8时,链表就转换成红黑树,查询的时间复杂度变成O(logn).当扩容时,桶中的元素个数小于树的链表还原阈值(默认是6),则会将红黑树转换成链表。哈希表的最小树形化容量是64,当哈希表的容量大于这个值64时,表中的桶(大于16)才能进行树化。 红黑树是一棵平衡二叉查找树,查找、插入和删除的时间复杂度都是O(logn). 红黑树的特点: 1. 根节点是黑色 2. 叶子节点是黑色 3. 节点是黑色或红色 4. 每个红色节点的两个子节点都是黑色 5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 (4) 关键属性 capacity 默认 16 、负载因子 loadFactor 默认 0.75 16

算法时间复杂度和空间复杂度

匿名 (未验证) 提交于 2019-12-03 00:22:01
一,算法 算法:解决特定问题求解步骤的描述。在计算机中表现为指令的有限序 列,每条指令可表示一条个或多个操作。 二,算法具有五个特性 输入:算法具有零个或多个输入。 输出:只有一个或多个输出。 有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且一个步骤在可接受的时间内完成。就是不会出现死循环。。。 确定性:每一个步骤都有确定含义,不会出现二义性 可行性:每一步都能够通过执行有限次数完成 。 总结一下就三点:正确;能完结;无二义性。 算法的时间复杂度和空间复杂度统称为算法的复杂度。 时间复杂度: (1)时间频度:一个算法中语句执行次数,记为T(n)。 时间复杂度实际上就是一个函数,该函数计算的是执行基本操作的次数。一个算法语句的执行次数是关于问题规模n的某个函数,我们把它记为f(n),n就是问题的规模。当问题规模N变化时,T(n)也在变化,算法执行次数的增长速率和f(n)的增长速率相同,即T(n)=f(n)。当n趋于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则成f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(f(n))为时间复杂度的O渐进表示法,也就是时间复杂度。 (2)最好,最坏和平均算法复杂度: 最好情况下:任意输入规模下的最大运行次数(上界)。 最坏情况下:任意输入规模下的最小运行次数(下界)。 平均情况

3、算法时间复杂度(笔记)

匿名 (未验证) 提交于 2019-12-03 00:22:01
算法时间复杂度的定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的事件量度。记作:T(n)=0(T(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进复杂度,简称时间复杂度。 ps:执行次数==时间 用大写O()来体现算法事件复杂度的记法。大O记法 一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法 即: O(1) : 要得到结果,只需要运行一次 O(n) : 要得到结果,需要运行n次 要得到结果,需要运行n次 如何分析一个算法的时间复杂度?即如何推导大O阶呢? ①、用常数1取代运行时间中的所有加法常数 ②、在修改后的运行次数函数中,只保留最高阶项。 ③、如果在最高阶项存在且不是1, 则去除与这个项相乘的常数。 ④、得到的最后结果就是大O阶。 简单的说: ①、常数阶: O(1) int sum = 0, n =100; printf("I love summer"); printf("I love summer"); printf("I love summer"); sum = (1+n)*n/2 T(n)是关于问题规模n的函数。中间输出多少个代码没关系,只有一条指令跟n有关系。 ②线性阶:线性阶就是随问题规模n的扩大