时间复杂度

java集合框架

偶尔善良 提交于 2019-12-05 13:42:42
List,Set,Map的区别 List (对付顺序的好帮手): List 接口存储一组不唯一(可以有多个元素引用相同的对象)、有序的对象 Set (注重独一无二的性质): 不允许重复的集合,不会有多个元素引用相同的对象 Map (用Key搜索的专家): 使用键值对存储。 Map 会维护与 key 有关联的值。两个 key 可以引用相同的对象,              但 key 不能重复。典型的 key 是 String 类型,但也可以是任意对象 ArrayList与LinkedList的区别 1.是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 2.底层数据结构: ArrayList 底层使用的是 Object 数组, LinkedKList 底层使用的是 双向链表 数据结构         (JDK1.6之前为循环链表,1.7取消了循环); 3.插入和删除是否受元素位置的影响: a. ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置                   的影响。比如:执行 add(E e) 方法的时候, ArrayList 会默认在将指定的元                   素追加到此列表的末尾,这种情况复杂度就是O(1) 指无穷小量 。                  

了解数据结构图 (graph)

半城伤御伤魂 提交于 2019-12-05 12:34:38
下面是本文对图操作的小结: 邻接表 邻接矩阵 空间复杂度 O(|V|+ |E|) O(|V|²) 添加 顶点 O(1) O(|V|²) 移除 顶点 O(|V| + |E|) O(|V|)² 添加 边 O(1) O(1) 移除 边 (基于 Array 实现) O(|E|) O(1) 移除 边 (基于 HashSet 实现) O(1) O(1 获取 相邻的顶点 O(|E|) O(|V|) 判断 是否相邻 (基于 Array 实现) O(|E|) O(1) 判断 是否相邻 (基于 HashSet 实现) O(1) O(1) 图的基础 图是一种(包含若干个节点),每个 节点 可以连接 0 个或多个元素 两个节点相连的部分称为 边(edge) 。节点也被称作 顶点(vertice) 。 一个顶点的 度(degree) 是指与该顶点相连的边的条数。比如上图中,紫色顶点的度是 3,蓝色顶点的度是 1。 如果所有的边都是双向(译者注:或者理解为没有方向)的,那我们就有了一个 无向图(undirected graph) 。反之如果边是有向的,我们得到的就是 有向图(directed graph) 。你可以将有向图和无向图想象为单行道或双行道组成的交通网。 此外,无环无向图也被称为 树(tree) 。 在图中,从一个顶点出发,并非所有顶点都是可到达的。可能会存在孤立的顶点或者是相分离的子图

LeetCode解题总结(1)

不打扰是莪最后的温柔 提交于 2019-12-05 12:20:23
LeetCode解题总结(1) 序 最近在对以前学过做过的东西做一些总结和回顾,为了检验学习成果和查漏补缺,开启了一段刷题之路。 1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. 思路 看完描述后,最容易想到的是暴力计算的思路,对每个数,用target减去这个数,得到一个需要用来相加的数字,然后遍历除自己外的所有数字,找出是否满足,如果满足,就返回这两个数的位置。此时,因为对每个数都要进行一次遍历,所以时间复杂度为O(n^2),不需要额外空间,空间复杂度为O(1)。 但是显然这样做是不好的,想到解唯一且重复的计算很多,所以用空间换时间的做法,每次相减后直接把结果记录下来,如果碰到一个数跟之前记录的需要的结果相同,即为解: 此时,只需要一次遍历即可,时间复杂度O(n),空间复杂度O(n) class Solution { public: vector<int> twoSum(vector

线段树

橙三吉。 提交于 2019-12-05 12:15:38
首先我们先明确两件事情! 1. 线段树他是个树! 2. 线段树是基于一个数组生成的! 好的这就已经大概勾勒出线段树美丽的轮廓了!那我们先来看一张照片。其中树的部分已经用看起来非常像树的颜色涂好了。 在这里插入图片描述 好那么废话不多讲我们就来说这个树是怎么长出来的吧。 我们要知道的是,树的每个节点上记录了一个区间。比如说,根节点记录了区间[1,8] [1,8],刚好是整个数组的长度。那么其他节点呢?这就是线段树的巧妙之处了。一个节点有两个子节点,且它们平分自己的区间。因此,根节点的两个子节点就分别对应了[1,4][1,4]和[5,8][5,8]。接下来[1,4][1,4]这个节点的两个子节点就是[1,2][1,2]和[3,4] [3,4]。 标上的每个节点代表的区间的照片如下。 在这里插入图片描述 最下面那一排为什么没有标呢?因为叶子节点刚好对应一个长度为1 1的区间,即从左到右分别为Unexpected text node: '&ThinSpace;' [1,1],[2,2],⋯,[8,8]。显然它也不会有儿子了。 哦我的天,你已经学会怎么基于数组建立线段树了!我相信到现在你应该还没用到2 2分钟吧! (其中看废话还要占1 1分钟) 还有一个小细节,比如假设你有一个区间[1,3] [1,3]它的长度是奇数这时怎么平分呢?其实左右那边长一点都没有关系,因此放心用你的整除号就行了。

学习数据结构Day2

会有一股神秘感。 提交于 2019-12-05 11:12:21
之前学习过了数组的静态实现方法,同时将数组的所有有可能实现的方法都统一实现了一遍,之后支持了泛型的相关 概念,接下来就是如何对数组进行扩容的操作也就是实现动态数组。 private void resize(int newcapacity){ E[] newdata = (E[]) new Object[newcapacity]; for (int i = 0; i < newcapacity; i++) { newdata[i] = data[i]; } data = newdata; } 在此处,我们写了一个关于resize的操作,其原理就是对就数组容量的扩容,扩容其原来的二倍。 同理,我们还可以进行对删除操作的优化,如果删完数据后,数组的容量有一半多是不用的空间,我们就可以进行删 掉一半的操作。 public E remove(int index) { if (index < 0 || index > size) { throw new IllegalArgumentException("require index >= 0 and index > size!"); } E ret = data[index]; for (int i = index + 1; i < size; i++) { data[i - 1] = data[i]; } size--; data[size]

时间复杂度为n^2的排序

时间秒杀一切 提交于 2019-12-05 10:54:22
时间复杂度为n^2的排序 冒泡排序和选择排序的共同点:每次都是在找剩下元素中最小(大)的元素 不同点:冒泡排序存在多次交换,而选择排序每次只存在一次交换序号 #include<iostream> using namespace std; void Insert_sort(int* a, int length); void Select_sort(int* a, int length); void Bubble_sort(int* a, int length); int main() { int n; cin >> n; int* a; a = new int[n]; for (int i = 0; i < n; i++) { cin >> a[i]; } Insert_sort(a, n); for (int i = 0; i < n; i++) { cout << a[i] << " "; } return 0; } //插入排序 时间复杂度 n^2 void Insert_sort(int* a, int length) { for (int i = 1; i < length ;i++) { int temp = a[i]; int j = i - 1; while (j >= 0 && a[j] > temp) { a[j + 1] = a[j]; j--; } a[j +

Redis GEO 地理位置

孤街浪徒 提交于 2019-12-05 10:13:28
目录 GEO指令 GEOADD GEODIST GEOPOP GEOHASH GEORADIUS GEORADIUSBYMEMBER 指令补充 删除操作 避免单集合数量过多 存储原理 GEOADD存储原理 GEOHASH精度问题 Redis 3.2版本新增GEO(地理位置)。 GEO指令 GEOADD 命令: GEOADD key longitude latitude member [longitude latitude member ...] 命令描述:将指定的地理空间位置(纬度、经度、名称)添加到指定的 key 中。 返回值:添加到sorted set元素的数目,但不包括已更新score的元素。 时间复杂度:O(log(N)) GEODIST 命令: GEODIST key member1 member2 [unit] 命令描述: 返回两个给定位置之间的距离。如果两个位置之间的其中一个不存在, 那么命令返回空值。指定单位的参数 unit 必须是以下单位的其中一个: m 米 km 千米 mi 英里 ft 英尺 时间复杂度:O(log(N)) GEOPOP 命令: GEOPOS key member [member ...] 命令描述:从key里返回所有给定位置元素的位置(经度和纬度)。 返回值:GEOPOS 命令返回一个数组, 数组中的每个项都由两个元素组成:

常用数据结构操作与算法复杂度总结

元气小坏坏 提交于 2019-12-05 07:15:20
目录 时间复杂度 常用数据结构操作与算法的复杂度 输入规模较小时的情况 引用 博客: blog.shinelee.me | 博客园 | CSDN 时间复杂度 如何评估一个算法的计算时间? 一个算法的 实际运行时间很难评估 ,当时的输入、CPU主频、内存、数据传输速度、是否有其他程序在抢占资源等等,这些因素都会影响算法的实际运行时间。为了公平地对比不同算法的效率,需要脱离开这些物理条件,抽象出一个数学描述。在所有这些因素中, 问题的规模往往是决定算法时间的最主要因素 。因此, 定义算法的时间复杂度 \(T(n)\) ,用来描述算法的执行时间随着输入规模的增长将如何变化,增长速度是怎样的 。 在输入规模较小时,运行时间本来就少,不同算法的差异不大。所以,时间复杂度通常关注的是输入规模 \(n\) 较大时运行时间的变化趋势,称之为 渐进复杂度 ,采用大O记号,表示 渐进上界 ,对于任意的 \(n >> 2\) ,若有常数 \(c\) 和函数 \(f(n)\) 满足 \[ T(n) \leq c \cdot f(n) \] 则记作 \[ T(n) = O(f(n)) \] 可以简单地认为, \(O(f(n))\) 表示运行时间与 \(f(n)\) 成正比,比如 \(O(n^2)\) 表示运行时间与输入规模的平方成正比,这样讲虽然并不严谨,但一般情况下无伤大雅 。 在 \(n\) 很大时

python实现真正的冒泡排序算法(时间复杂度优化版)!

本小妞迷上赌 提交于 2019-12-05 03:56:32
近期很多童鞋在讨论大厂面试的算法题,有部分同学表示一脸懵逼,不知从何下手,还有一一部分同学写的冒泡排序算法是直接从网上复制下来的冒泡排序,大多数都没有考虑时间复杂度,说白了只是实现了冒泡的流程,严格来讲只能算是一个伪冒泡排序, 那么接下来给大家来捋一捋冒泡排序的原理,只有搞懂排序的原理,才能更好的掌握,写出真正的冒泡排序算法: 1、冒泡排序原理 直观点先看图(注:图片来源于网络)    从上图我们可以看出冒泡排序的规则,归纳几点如下: 冒泡的规则: 每一轮获取第一个数和后面的数据进行依次比较的过程,称为一轮冒泡的过程 每一轮冒泡.都是先拿第一个数,依次比对相邻的两个数,如果前一个数比后一个数大,则交换他们的位置,这一轮比较完毕,会把最大的数放在最后面。 然后反复重复上面的步骤(每一轮都能将前面数据中一个最大数,放到后面),直到一轮冒泡下来没有任何数据需交互位置,此时数据已经为有序状态 冒泡的次数: 假设列表的长度为n,冒泡排序是每次拿出来第一个元素,需要拿多少次呢?应该是列表的长度减1,意味着每一个长度为n的列表,需要冒泡 n-1 次 每次冒泡比较的次数: 每一次冒泡,都能排好一个数据的顺序,第一次冒泡,需要进行依次比较的次数为n次,那么随着次的增加排好的数据也会越多,需要比较的数据就越少。关系图如下: 第几次冒泡 比较的次数 1 n-1 2 n-2 3 n-3 4 n-4

redis的常用指令及操作之一

隐身守侯 提交于 2019-12-05 03:48:26
一、 Redis中常用的与数据库有关的指令 说明 : 使用redis的默认配置器动redis服务后,默认会存在16个库,编号从0-15 可以使用select 库的编号 来选择一个redis的库 清空当前的库 FLUSHDB 清空全部的库 FLUSHALL 1. DEL 二、 Redis中常用的与key相关的指令 语法 : DEL key [key ...] 作用 : 删除给定的一个或多个key 。不存在的key 会被忽略。 可用版本: >= 1.0.0 时间复杂度: O(N),N 为被删除的key 的数量。 删除单个字符串类型的key ,时间复杂度为O(1)。 删除单个列表、集合、有序集合或哈希表类型的key ,时间复杂度为O(M),M为以上数据结构内的元素数量。 返回值: 被删除key 的数量。 2. EXISTS 语法: EXISTS key 作用: 检查给定key 是否存在。 可用版本: >= 1.0.0 时间复杂度: O(1) 返回值: 若key 存在,返回1 ,否则返回0 。 3. EXPIRE 语法: EXPIRE key seconds 作用: 为给定key 设置生存时间,当key 过期时(生存时间为0 ),它会被自动删除。 在Redis 中,带有生存时间的key 被称为『易失的』(volatile)。生存时间可以通过使用DEL 命令来删除整个key 来移除