对于查找,往常来说,我们面对的数据并没有如此巨大,但是我们需要经常混合的使用插入和查找的操作

本章将见识到三种经典的数据类型来实现的符号表

二叉查找树 红黑树 散列树

对应各种优缺点如表

图片

本章用于配合查找使用的数据结构为

符号表:

将一个键和一个值联系起来

我们将符号表实现为高级的抽象数据结构,

基本上是Map的抽象

API为

图片

对于这个ST的实现,有如下的要求

对于重复的键,是不允许存在重复的键的

但如果存入的键值对和已有的冲突时,那么新的值代替旧的值

但是不能存在空键

也不能存在空值,一旦为空值,就会删除对应键

删除操作:实现方式两种 延迟删除: 将键对应的值设置为空.然后在某一时间一口气删除所有为空的键

或者即时删除.put(key,null)就是一种延迟删除,

delete也是一种即时删除,

if(val ==null){

delete(key);

return;

}

对应的实现方式中,实现

图片

如果使用有序的数组来进行实现,那么可以提供更多的功能,删除最大的键,最小的键

还有如下的API

图片

图片

如果使用无序链表的实现

则是每次get都需要遍历整个链表,并且equals的方法也是通过遍历实现的

这种方式被我们称为顺序查找,但是基于链表的实现以及顺序查找是很

public class SequentialSearchST<Key,Value> {

private Node first;//默认设置第一个

private class Node{//定义链表

Key key;

Value val;

Node next;

public Node(Key key,Value val,Node next) {//构造方法

this.key = key;

this.val = val;

this.next = next;

}

}

public Value get(Key key) {//查找方法

for (Node x = first; x!=null;x=x.next) {//遍历

if (key.equals(x.key)) {//如果相同键

return x.val;

}

}

return null;

}

public void put(Key key,Value val) {//添加的方法,先查找,就更新,没就新建结点

for (Node x = first; x!=null;x=x.next) {

if (key.equals(x.key)) {

x.val =val;

return;//的话

}

}

first = new Node(key, val, first);//未命中,新建站点

}

public int size() {

int count=0;

for (Node x = first; x!=null;x=x.next) {

count++;

}

return count;

}

public void delete(Key key) {

for (Node x = first; x!=null;x=x.next) {

if (x.next.key.equals(key)) {//如果他下面的等于

x.next = x.next.next;//直接删除,jvm自动回收

}

}

}

}

仓库地址在

https://github.com/HeavenXin/Data_Structure_Search

发表评论

邮箱地址不会被公开。 必填项已用*标注