发表于: 2017-07-09 22:52:56
1 1301
今天完成的事情:停付老师讲课
1.怎么查找资料
百度google相关问题
2.怎么定位问题
查看日志
3.怎么解决问题
根据日志的问题描述解决问题,没头绪百度google
4.怎么重构代码
对重构代码没有太多经验
5.怎么选择框架
根据需求确该选择什么框架
6.怎么测试
使用junit,postman等测试工具来进行测试
1、查找及顺序查找
查找:在数据集合中,根据给定的值,确定关键字等于给定值的记录或数据元素。存在记录为成功,否则不成功。
用于查找的数据集合称为查找表,它可以使一个链表,或是一个数组或者其他数据结构。
静态查找----对查找表只做查询某个“特定的”数据元素是否在表中和检索某个“特定的”数据元素的各种属性的操作的一类表。
动态查找----若在查找过程中同时插入查找表中不存在的数据元素或者删除已存在的数据元素的一类表。
顺序查找是一种最简单的查找方法。它是从线性表的一端开始,顺序扫描线性表,依次将扫描到的结点关键字和给定值k相比较,若当前扫描到的元素关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的结点,则查找失败。
2.Hash表
前面介绍的线性表查找中,记录(数据)在表中的位置和记录的关键字之间不存在确定关系。查找效率取决于比较的次数。
对元素的关键字值进行函数运算,计算出的函数值作为存储该元素的地址(Hash(key)= Addr)这种存储方式就是散列存储。
散列表(又称哈希表):是根据关键字而直接进行访问记录的数据结构,它建立了关键字和存储地址之间的一种映射关系。
假定某教室有35个座位,哈希函数是限定学生所坐的位置应与其学号的末两位相同,则学号为0601605的学生应坐编号为5的座位。这样我们要找某个学生时只需根据其学号的末两位到相应座位上去找即可,不必一一比较了。
学生好比记录,学号则为关键字,对关键字进行的操作----哈希函数则是取其末两位,用以确定记录的位置。
一个好的哈希函数能将给定的数据集均匀地映射到给定的地址区间中。
2.1 直接定值法
H(ki)=a*ki+b,例如按序号的若干倍加上一个常数存储。
这种哈希函数计算简单,并且不可能有冲突发生。将造成内存单元的大量浪费。
2.2 除留余数法
H(k)=k mod m,
如下关键字集合的哈希表:{16,74,60,43,54,90,46,31,29,88,77}。 取m=13, 则有:
h(16)=3,h(74)=9,h(60)=8,h(43)=4,h(54)=2,h(90)=12,h(46)=7,h(31)=5,
h(29)=3, h(88)=10, h(77)=12。
注意:存在冲突(红色)。
2.3 数字分析法
取关键字中某些取值较分散的数字位作为散列地址。
如取下列各元素的第6位和第7位:{100011211,100011322,100011413,100011556,100011613,100011756,100011823}的散列地址分别是:12,13,14,15,16,17,18。
在哈希表中,虽然冲突很难避免,但发生冲突的可能性却有大有小。处理冲突的常用方法:
1)拉链法
把具有相同散列地址的关键字放在同一个链表中,成为同义词链表。有几个散列地址就有几个链表。
2)开放定址法:
开放定址法是指可存放新表项的空闲地址既可以向它的同义词表项开放,又可以向它的非同义词表项开放。
Hi=(H(key)+di)%m(其中m为散列表表长,di为增量序列。)
不同的增量序列又可以形成不同的方法:线性探测法(di=1,2,3...,m-1);平方探测法(di=12,-12,22,-22....)等。
3、Set、Map、List
List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList和Vector的区别:ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低
Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)
Query接口有一个实现类:LinkList
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;HashTable线程安全,低效,不支持null
SortedMap有一个实现类:TreeMap
其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对
set 一般无序不重复.map kv 结构 list 有序 。
List的功能方法
实际上有两种List: 一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。
List : 次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
ArrayList : 由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。
LinkedList : 对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。
Set的功能方法
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)
Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。
HashSet : 为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
TreeSet : 保存次序的Set, 底层为树结构。使用它可以从Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。
Map的功能方法
方法put(Object key, Object value)添加一个“值”(想要得东西)和与“值”相关联的“键”(key)(使用它来查找)。方法get(Object key)返回与给定“键”相关联的“值”。可以用containsKey()和containsValue()测试Map中是否包含某个“键”或“值”。标准的Java类库中包含了几种不同的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它们都有同样的基本接口Map,但是行为、效率、排序策略、保存对象的生命周期和判定“键”等价的策略等各不相同。
执行效率是Map的一个大问题。看看get()要做哪些事,就会明白为什么在ArrayList中搜索“键”是相当慢的。而这正是HashMap提高速度的地方。HashMap使用了特殊的值,称为“散列码”(hash code),来取代对键的缓慢搜索。“散列码”是“相对唯一”用以代表对象的int值,它是通过将该对象的某些信息进行转换而生成的。所有Java对象都能产生散列码,因为hashCode()是定义在基类Object中的方法。
HashMap就是使用对象的hashCode()进行快速查询的。此方法能够显著提高性能。
Map : 维护“键值对”的关联性,使你可以通过“键”查找“值”
HashMap : Map基于散列表的实现。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量capacity和负载因子load factor,以调整容器的性能。
LinkedHashMap : 类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点。而在迭代访问时发而更快,因为它使用链表维护内部次序。
TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
WeakHashMao : 弱键(weak key)Map,Map中使用的对象也被允许释放: 这是为解决特殊问题设计的。如果没有map之外的引用指向某个“键”,则此“键”可以被垃圾收集器回收。
IdentifyHashMap : 使用==代替equals()对“键”作比较的hash map。专为解决特殊问题而设计。
明天计划的事情:继续学习springboot完成任务
遇到的问题:无
收获:复习数据结构
评论