数据结构

学习数据结构的第四天

a 夏天 提交于 2020-03-31 10:28:43
class Solution { private class BST<E extends Comparable<E>> { //这里也是暗含乾坤,必须extends呀 private Node root; private int size; private class Node { E value; Node left; Node right; public Node(E e) { value=e; left=null; right=null; } } public boolean contains(E e) { return contains(this.root,e); } private boolean contains(Node node,E e) { if(node==null) return false; if(node.value.equals(e)) //如果是引用类型的话,那么就是.equals return true; if(node.value.compareTo(e)>0) return contains(node.left,e); if(node.value.compareTo(e)<0) return contains(node.right,e); return false; } public void add(E e) { this.size++;

Java集合(2)一 ArrayList 与 LinkList

梦想与她 提交于 2020-03-31 08:54:02
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树、TreeMap与TreeSet(上) Java集合(4)一 红黑树、TreeMap与TreeSet(下) Java集合(5)一 HashMap与HashSet 引言 ArrayList<E>和LinkList<E>在继承关系上都继承自List<E>接口,上篇文章我们分析了List<E>接口的特点:有序,可以重复,并且可以通过整数索引来访问。 他们在自身特点上有很多相似之处,在具体实现上ArrayList<E>和LinkList<E>又有很大不同,ArrayList<E>通过数组实现,LinkList<E>则使用了双向链表。将他们放到一起学习可以更清楚的理解他们的区别。 框架结构 从上面的结构图可以看出ArrayList<E>和LinkList<E>在继承结构上基本相同,值得注意的是LinkList<E>在继承了List<E>接口的同时还继承了Deque<E>接口。 Deque<E>是一个双端队列的接口,LinkList<E>由于在实现上采用了双向链表,所以可以很自然的实现双端队列头尾进出的特点。 数据结构 上一篇文章中我们说过,为什么一个Collection<E>接口会衍生出这么多实现类,其中最大的原因就是每一种实现在数据结构上都有差别

数据结构---数组

≡放荡痞女 提交于 2020-03-31 08:35:43
线性表 ,顾名思义就像一条线一样,线性表是有序的,这个 “有序”不是从小到大之类的概念。当然与之对应就是 散列表 ,散就是乱的,无序的。 Java 中 List 和 Set ,我们遍历 List 每次结果都是一样,这就是所谓的有序,遍历 Set ,每次出来的结果可能都不一样,这就是无序的。 数组 是一种相同数据类型的元素组成的集合,是一种线性表,同样属于线性表结构的还有链表,队列,栈。 数组在内存需要连续的空间来存放,这就是为什么申明数组的时候一定要设置大小,因为只有设置了大小,才知道这个数组需要多大的内存空间,才能去内存中寻找大小合适的空间存放。正是因为它是连续的,而且都是有下标索引的,所以具有很好的随机访问性。 为什么数组具有很好的随机访问性?为什么数据可以根据下标访问?为什么下标要从 0 开始? 这就要说一下数组存储结构。 比如 int[] arr = new int[2] 这个数组去内存开辟空间的时候, 假如 arr 在内存的位置是从 1000 开始的,那么 Arr[0] 在内存中的位置是    1000 Arr[1] 在内存中的位置是    1000 + arr[0] 数据大小 Arr[2] 在内存中的位置是    1000 + arr[0] 数据大小 + arr[1] 数据大小 因为数组都是同一种数据类型所以每个元素的数据大小是一样的,换做如下表示就更清晰了 Arr[0

android 中 ArrayList 、LinkList、List 区别

ぐ巨炮叔叔 提交于 2020-03-31 07:11:55
1.大学数据结构中ArrayList是实现了基于动态数组的数据结构,LinkList基于链表的数据结构。 2.对于随机访问get和set,ArrayList优于LinkList,因为LinkedList要移动指针。 3.对于新增和删除操作add和remove,LinkList比较占优势,因为ArrayList要移动数据。 从上面三点可以看出: ArrayList和LinkList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。 而,List继承自Collection接口。List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作。 总结如下: List是一个接口,ArrayList、LinkList继承与这个接口并实现了它. 用的时候,可以这么用: List<String> list = new ArrayList<String 等同于 ArrayList<String> list=new ArrayList<String> 来源: https://www.cnblogs.com/boyupeng/archive/2011/04/19/2028520.html

java集合--collection集合

寵の児 提交于 2020-03-31 06:40:17
1、画出collection的框架图   集合主要包含collection和map两个接口。其中collection中的元素是一个value值,map中的元素是key:value形式的。   collection包含set、list、queue。     (1)list:list接口包含ArrayList,Vector,LinkedList。     (2)set包含HashSet,TreeSet,EnumSet。     (3)Queueu包含LinkedList,PriorityQueue   map包含HashMap,HashTable,TreeMap,WeakHashMap,IdentityHashMap,EnumMap 2、详述List、Map、Set的区别?(底层实现的数据结构不同)   (1)List:有序,可重复。     ArrayList:底层实现的数据结构是数组,查询快,增删慢。线程不安全,效率高     LinkedList:底层实现的数据结构是链表,查询慢,增删块。线程不安全,效率高     Vector:底层实现的数据结构是数组,查绚块,增删慢。线程安全,效率低。   (2)Set:无序,唯一。     HashSet:底层数据结构是哈希表(无序,唯一)。保证元素唯一性依赖于两个方法:hashCode()和equals()    

Redis学习

空扰寡人 提交于 2020-03-30 22:15:34
学习自《Redis开发与运维(付磊)》 目录 简介 特性 使用原因 高性能 高并发 典型使用场景 缓存 排行榜 计数器 社交网络 消息队列 API使用 全局命令 支持的数据结构 String Hash List Set Sorted Set (ZSet) 简介 Redis是一种基于键值对(key-value)的NoSQL数据库。 特性 速度快 Redis的数据都存放在内存中,代码通过C语言实现,使用了单线程的IO多路复用机制,这些都使得redis的读写速度非常快。 基于键值对的数据结构服务器 Redis全称是remote dictionary server,即远程字典服务器。很多编程语言都提供了字典的功能,即基于键值对的方式存储数据。Redis中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅能便于在许多应用场景的开发,同时也能够提高开发效率。 功能丰富 Redis提供的功能如下: 提供了键过期功能,可以用来实现缓存。 提供了发布订阅功能,可以用来实现消息系统。 支持Lua脚本功能,可以利用Lua创造出新的Redis命令。 提供了简单的事务功能,能在一定程度上保证事务特性。 提供了流水线功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销。 简单稳定 Redis的简单主要体现在三个方面: Redis的源码很少,早期版本的代码只有2万行左右,3

4L-线性表之数组

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

数据结构-王道-绪论

☆樱花仙子☆ 提交于 2020-03-30 09:43:06
目录 绪论 四种逻辑关系 储存方式 数据结构的三个组成部分 抽象数据类型 算法 特性 时间/空间 复杂度 计算的方法通常有两种 空间复杂度 绪论 数据 :客观事物的符号表示.在计算机科学中指的是所有能输入到计算机中冰杯计算机程序处理的符号的总称. 数据又分为 数值型数据,非数值型数据 数据元素 :是数据的 基本单位 ,在程序中通常会作为一个 整体 来进行处理和考虑. 数据项 :一个数据元素可由多个 数据项(Data Item) 组成。 最小单位 : 数据项 是数据的不可分割的 最小单位 , 数据项 是对客观事物 某一方面特性的数据描述 。 例如 :按照学生的成绩进行排名。1:在计算机中找到学生们的数据,每一个学生的数据都是一个 数据元素(基本单位) ,其中含有关于学生各方面属性的 数据项(最小单位) ,然后我们按照每个 学生(数据元素) 的 成绩(数据项) 对 学生(数据元素) 这个整体进行排名。 数据对象(Data Object) :是性质相同的 数据元素(基本单位,整体考虑) 的集合,是数据的一个子集。如字符集合 \(C=\{'A','B','C',...\}\) 。 数据结构 :指的是相互之间存在一定的关系的数据元素的集合。元素之间的相互联系称为逻辑结构。 四种逻辑关系 集合 :结构中的数据元素除了“同属于一个集合”外,没有其他的任何关系。 线性结构

【数据结构】树状数组

ぃ、小莉子 提交于 2020-03-30 09:12:42
【树状数组】   顾名思义:本质是数组,逻辑上是被构造出来的二叉树,方便求前缀和,以及更新元素值   关键:设原数组为A,设构造出来的树状数组为 C,令   C i = A i-lowbit(i) + 1 + A i-lowbit(i) + 2 + .......... + A i , 其中lowbit(i) = i & (-i)    所以   操作1:求前缀和 Si = Ci + Ci-lowbit(i) + ...... 直到 C 的下标 index = i - lowbit(i) = 1   操作2:元素A[x] 的值加上 y ,需要更新包含A[x] 的区间:                        C[x] = C[x] + y                        x = x + lowbit(x) C[x] = C[ x ] + y                         ........                        直到 x > n (n 为元素个数)   可以得以上两个操作的时间复杂度均为 O( logn ) 【应用】    求逆序对 【优化】    【模板】 /*树状数组模板注意数组C[]下标是从1开始by chsobin*/const int maxn = 32005; int c[maxn]; void init(){

【数据结构】树状数组

好久不见. 提交于 2020-03-30 09:12:24
使用目的 树状数组是为了解决多次单点更新,区间查询等问题的数据结构。 树状数组的更新与查询复杂度均为O(logn)。 为了方便理解树状数组的优势,这里先给出一道题目: 给一大小固定的A数组,现用户可随意更改此数组的任何n个元素为任何值,且用户还想知道每次更改元素后数组中下标从0到m的元素的和。请你用快速的方法解决这个问题。 那么最简单的思路是在每次查询时从0到m做一次求和。但当更改和查询次数巨大的时候,我们不得不换一种思路以免超时。 那么树状数组就是可选的一种结构。 数据结构 为了解决问题,我们希望在求和的时候不要一个一个元素求和,而是一段一段求和。 因此,我们考虑设计一些节点存储一段元素的和,在用户求和的时候可以一段一段求。并且这个节点的数量应该恰到好处,因为我们后续更新这些节点必须快速方便。 庆幸的是有一种方便且快速的数据结构可供我们使用,那就是树状数组。 (这里引用了他人图片,原作者信息在图片上) 为了构造这样一个结构,我们先把数组A的一些元素“提”起来,做成图中的数组C的样子。 我们考虑把数组C看成上述的节点,这些节点存储着相应的一段元素的和。 为了方便找到其中的规律,把数字的二进制形式写出来: 0001 C[1] = A[1] 0010 C[2] = C[1] + A[2] = A[1] + A[2] 0011 C[3] = A[3] 0100 C[4] = C[2] +