刷题
刷题
learn
learn
日期
Aug 31, 2024
哈希表的用法(认为是集合,根据值来做key,或者根据内存地址做key)
- HashSet和HashMap原理一样,有无伴随数据的区别(Map比Set多了个伴随数据)
- 增删改查时间为,但是大常数
- 所以当key的范围是固定的、可控的情况下,可以用数组结构代替哈希表结构
注意:
- Java中通过自定义hashCode、equals等方法,任何类可以实现“根据值做key”或者“根据内存地址做key”的需求
- 八种基本类型:Integer、Long、Double、Float、Byte、Short、Character、Boolean以及String都会这些变量的值做key,比如有
a = 1
,b = 1
,那么向HashSet中添加a
后查询b
,会显示存在; - 除了以上的其他类型,比如自定义的结构或者类作为HashSet的元素的时候,会以它们的内存地址为key,这时即使两个添加的元素内容完全一样,也不会出现上面的情况
有序表的用法(认为是集合,但有序组织)
- TreeSet和TreeMap原理一样,有无伴随数据的区别(同样,Map比Set多了个伴随数据)
- 增、删、改、查+很多和有序有关的操作(floor、ceilling等),时间为
- 有序表比较相同的东西会去重,如果不想去重就加入更多的比较策略(比较器定制)。堆不会去重
- 有序表在Java中就是用红黑树实现的
- AVL树、SB树、替罪羊树、Treap、Splay、跳表等很多结构都可以实现同样功能
比较器:定制比较策略,用在排序、堆、有序表等很多需要有序的结构中都可使用
- 定义类、直接Lamda表达式
- 字典序的概念
- 如:‣,可以使用比较器先定制如何排序,然后再用排序算法即可解