数据结构

java数据结构17_HashSet类详解

妖精的绣舞 提交于 2020-02-28 21:10:08
1.Set接口介绍 Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。我们在前面通过List学习的方法,在Set中仍然适用。因此,学习Set的使用将没有任何难度。 Set容器特点: 无序、不可重复 。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。 Set 集合有多个子类,这里我们介绍其中的 HashSet、LinkedHashSet 、TreeSet这三个集合。 2. HashSet类详解 HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。 我们打开HashSet的源码,发现里面有一行核心代码: 我们发现里面有个map属性,这就是HashSet的核心秘密。我们再看add()方法,发现增加一个元素说白了就是在map中增加一个键值对,键对象就是这个元素,值对象是名为PRESENT的Object对象。说白了,就是“往set中加入元素,本质就是把这个元素作为key加入到了内部的map中”。 由于map中key都是不可重复的,因此,HashSet天然具有“不可重复”的特性。 HashSet 的使用 给 HashSet 中存储 JavaAPI 中提供的类型元素时,不需要重写元素的 hashCode 和

数据结构与算法学习笔记九 --- 快速排序算法

梦想与她 提交于 2020-02-28 18:51:27
快速排序算法(Quick Sort) 快速排序算法是一种递归排序算法; 其 原理 是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 简单点理解就是:以序列中的任意一个元素为基准(一般以第一个元素),通过逐个比较后,找到这个基准元素的合适位置(即在基准元素的左边元素都比它小,右边都比它大),这时在将序列分成左右两个部分,在继续上述的操作,直到不能再分为止(只有一个元素),此时排序也就完成。 快速排序过程图 快速排序算法的python实现 快速排序算法的代码实现最主要的是找到基准元素的位置,然后分成两部分,再用递归的方法,重复实现一样的操作。 代码如下: def quick_sort ( alist , first , last ) : """快速排序""" # 参数first,last:指定序列排序的位置起始和终止下标 # 只有当first小于last时才退出排序,此时元素只有一个。 if first >= last : return alist else : mid_value = alist [ first ] low = first high = last while low < high : # high 左移 while

Java数据结构总结

懵懂的女人 提交于 2020-02-28 18:25:16
一:通过一些源码展示各种数据结构的使用方法: 1.顺序表 概念及结构 : 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改 public interface ISequence { //在pos位置插入val boolean add(int pos,Object data); //查找关键字key 找到返回key的下标,没有返回null; int search(Object key); //查找是否包含关键字key是否在顺序表当中(这个和search有点冲突) boolean contains(Object key); //得到pos位置的值 Object getPos(int pos); //删除第一次出现的关键字key Object remove(Object key); //得到顺序表的长度 int size(); //打印顺序表 void display(); //清空顺序表以防内存泄漏 void clear(); } 2.链表 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链 接次序实现的 。 链表的种类: 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结 构,如哈希桶、图的邻接表等等。 带头循环单链表

#数据结构-fib

断了今生、忘了曾经 提交于 2020-02-28 11:39:03
1 /////////////////////////////////////////////////////////////////////////////// 2 // 3 // FileName : fic.c? 4 // Version : 0.10 5 // Author : Ryan Han 6 // Date : 2013/07/01 10:12:30 7 // Comment : 8 // 9 /////////////////////////////////////////////////////////////////////////////// 10 #include <stdio.h> 11 12 static long fib(const long n) 13 { 14 return 0 == n || 1 == n ? 1 : fib(n - 1) + fib(n - 2); 15 } 16 17 int main() 18 { 19 //F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 20 long lResult = fib(5); 21 printf("The resutl is: %ld\n", lResult); 22 } 上面的方法会导致大量的重复计算,为了避免可以用非递归的方式计算: 1 // 19_2.cc 2

redis的五种数据结构

五迷三道 提交于 2020-02-28 10:44:50
五种数据结构 1、string 2、hash(类似map) 3、list 4、set 5、有序set jedisClient.set("redis_test", "value"); String redisStr = jedisClient.get("redis_test"); jedisClient.hset("rule","name","chi.zhang04"); jedisClient.hset("rule","age","27"); jedisClient.hset("rule","sex","male"); Map<String,String> map = jedisClient.hgetall("rule"); jedisClient.lpush("list", "l1","l2","l2","l3"); List<String> list = jedisClient.lrange("list", 0l, 3l); jedisClient.sadd("redis_set", "set1", "set2", "set3","set3"); Set<String> str = jedisClient.smembers("redis_set"); System.out.println(str); Map<String,Double> maps = Maps

新浪微博 发微博消息的处理

六眼飞鱼酱① 提交于 2020-02-28 07:33:58
1.普通小众用户 采用pull推送模式 往粉丝消息队列里分别异步推送消息ID。 lpush和 lpop 使用。模拟栈数据结构。先进后出。 lpush user:1 1001 lrange user:1 1 10 取出10条最新消息 同理:微信朋友圈。也可以这办。展示的时候取最近的数据。 2 微博大V粉丝都有500w+,发微博时,数据到底是怎么处理的? 之前了解, 微博一个大V 粉色都有500w+的粉丝, 他每更新一条微博, 都必须推送到关注着的阅读列表中,听说刚开始一次性推送到所有粉丝的列表中,后来用信息队列,先直接发还给用户自己,在异地队列分发给所有在线的用户,然后再出来未登陆的用户, 想问下,这么大的数据量就算异步处理也有很大难度啊。哪个大神知道他的具体数据结构设计和架构设计 好像是综合PUSH和PULL模式。 对于大V用户,采用PULL模式,他发表一条微博,就放在自己的MAIL BOX里。然后他的粉丝登陆后将主动去MAIL BOX里PULL数据,这种情况计算开销会增加,但存储开销极大下降。 另外对于热门用户、热门微博,这些都是热数据,会跟冷数据区别对待的,具体处理方法比如缓存。 二线互联网公司。做缓存大多是redis。丰富的数据结构。可以模拟多种数据结构。适用各种业务场景。以及kafka等消息中间件。异步处理问题。加快相应时间。 一线互联网。缓存和消息中间件大多是自研的产品

趣味编程:函数式链表的快速排序

这一生的挚爱 提交于 2020-02-28 07:04:07
前一段时间有朋友问我,以下这段Haskell快速排序的代码,是否可以转化成C#中等价的Lambda表达式实现: qsort [] = [] qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs) 我当时回答,C#中缺少一些基础的数据结构,因此不行。经过补充之后,就没有任何问题了。后来,我觉得这个问题挺有意思,难度适中,也挺考察“基础编程”能力的,于是就自己写了一个。如果您感兴趣的话,也不妨一试。 这段代码是经典的,常用的体现“函数式编程”省时省力的例子,用短短两行代码实现了一个快速排序的确了不起。您可能不了解Haskell,那么我在这里先解释一下。 首先,这里用到了函数式编程语言中最常用的一种数据结构:不可变的链表。这个数据结构事实上是一个单向链表,并且是“不可变”的。这种数据结构在F#中也有存在,它的结构用大致是这样的: 可见,这是一种递归的数据结构。如果我们把这种数据结构叫做是ImmutableList的话,那么每个ImmutableList对象就会包含一个元素的“值”,以及另一个ImmutableList对象(在上图中,每个框就是一个ImmutableList对象)。对于每个ImmutableList对象来说,这个“值”便是它的“头(Head)”

双向链表数据结构

我与影子孤独终老i 提交于 2020-02-28 04:17:50
一. 认识双向链表 双向链表介绍 单向链表: 只能从头遍历到尾或者从尾遍历到头(一般从头到尾) 也就是链表相连的过程是单向的. 实现的原理是上一个链表中有一个指向下一个的引用. 单向链表有一个比较明显的缺点: 我们可以轻松的到达下一个节点, 但是回到钱一个节点是很难的. 但是, 在实际开发中, 经常会遇到需要回到上一个节点的情况 举个例子: 假设一个文本编辑用链表来存储文本. 每一行用一个String对象存储在链表的一个节点中. 当编辑器用户向下移动光标时, 链表直接操作到下一个节点即可. 但是当用于将光标向上移动呢? 这个时候为了回到上一个节点, 我们可能需要从first开始, 依次走到想要的节点上. 双向链表 既可以从头遍历到尾, 又可以从尾遍历到头 也就是链表相连的过程是双向的. 那么它的实现原理, 你能猜到吗? 一个节点既有向前连接的引用, 也有一个向后连接的引用. 双向链表可以有效的解决单向链表中提到的问题. 双向链表有什么缺点呢? 每次在插入或删除某个节点时, 需要处理四个节点的引用, 而不是两个. 也就是实现起来要困难一些 并且相当于单向链表, 必然占用内存空间更大一些. 但是这些缺点和我们使用起来的方便程度相比, 是微不足道的. 双向连接的图解: img 双向链表的创建 我们来创建一个双向链表的类 // 创建双向链表的构造函数 function

干货分享,值得收藏:搞懂这些redis知识点,还怕干不过面试官?

爷,独闯天下 提交于 2020-02-28 00:49:45
是数据结构而非类型 很多文章都会说,redis支持5种常用的数据类型,这其实是存在很大的歧义。redis里存的都是二进制数据,其实就是字节数组(byte[]),这些字节数据是没有数据类型的,只有把它们按照合理的格式解码后,可以变成一个字符串,整数或对象,此时才具有数据类型。 这一点必须要记住。所以任何东西只要能转化成字节数组(byte[])的,都可以存到redis里。管你是字符串、数字、对象、图片、声音、视频、还是文件,只要变成byte数组。 因此redis里的String指的并不是字符串,它其实表示的是一种最简单的数据结构,即一个key只能对应一个value。这里的key和value都是byte数组,只不过key一般是由一个字符串转换成的byte数组,value则根据实际需要而定。 在特定情况下,对value也会有一些要求,比如要进行自增或自减操作,那value对应的byte数组必须要能被解码成一个数字才行,否则会报错。 那么List这种数据结构,其实表示一个key可以对应多个value,且value之间是有先后顺序的,value值可以重复。 Set这种数据结构,表示一个key可以对应多个value,且value之间是没有先后顺序的,value值也不可以重复。 Hash这种数据结构,表示一个key可以对应多个key-value对,此时这些key

java常见面试题汇总(一)

人盡茶涼 提交于 2020-02-28 00:35:12
面临金九银十的黄金跳槽季,不光是很多在职人员跃跃欲试,也有很多大学生积极地加入到应聘行列。作为技术出身的我们,找工作的一大前提就是技术是否能过关。而对于java程序员来说,至少是两关的面试,这首个关卡就是笔试,今天我总结了一些关于java的面试题,希望能帮助到正在求职的你! 1、java的数据结构你用过那些?map与set的本质区别是什么 数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。 依据逻辑关系,数据结构分为:线性和非线性数据结构。 2、Map与Set的本质区别是什么? Set不能包含重复的元素,zui多有一个空值,继承自Collection接口,底层是Map实现机制。Map不能包含重复的键,每个键zui多对应一个映射的值,不能有空值键。两接口提供的方法不完全一样。 3、Java常见的数据结构有哪些? Java常见的数据结构有Collection和Map,其中Collection接口下包括List和Set接口,其下又有多个实现类如List下有 ArrayList、LinkedList和Vector等实现类,Set下有HashSet、LinkedSet等实现类和SortedSet接 口,HashSet下有LinkedHashSet子类,SortedSet接口下有TreeSet实现类。Map接口下有HashMap(有 LinkedHashMap子类)