第十八天算法设计
OrderedSymbolTable 类:
java
package suanfa;
import java.util.Arrays;
public class OrderedSymbolTable<K extends Comparable
private static final int INIT_CAPACITY = 8;
private int size = 0;
private K[] keys;
private V[] values;
// 构造函数初始化一个空的有序符号表
public OrderedSymbolTable() {
keys = (K[]) new Comparable[INIT_CAPACITY];
values = (V[]) new Object[INIT_CAPACITY];
}
// 获取符号表中键对应的值
public V get(K key) {
int index = rank(key);
if (index < size && keys[index].compareTo(key) == 0) {
return values[index];
}
return null;
}
// 向符号表中插入键值对
public void put(K key, V value) {
int index = rank(key);
// 如果键已经存在,更新对应的值
if (index < size && keys[index].compareTo(key) == 0) {
values[index] = value;
return;
}
// 如果键不存在,插入新的键值对
if (size == keys.length) {
resize(keys.length * 2); // 扩容
}
for (int i = size; i > index; i--) {
keys[i] = keys[i - 1];
values[i] = values[i - 1];
}
keys[index] = key;
values[index] = value;
size++;
}
// 删除符号表中的某个键值对
public void delete(K key) {
int index = rank(key);
if (index < size && keys[index].compareTo(key) == 0) {
for (int i = index; i < size - 1; i++) {
keys[i] = keys[i + 1];
values[i] = values[i + 1];
}
keys[size - 1] = null;
values[size - 1] = null;
size--;
if (size > 0 && size == keys.length / 4) {
resize(keys.length / 2); // 缩容
}
}
}
// 返回符号表中小于给定键的元素个数
public int rank(K key) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
int cmp = key.compareTo(keys[mid]);
if (cmp < 0) high = mid - 1;
else if (cmp > 0) low = mid + 1;
else return mid;
}
return low;
}
// 扩容或缩容符号表的数组
private void resize(int capacity) {
K[] newKeys = (K[]) new Comparable[capacity];
V[] newValues = (V[]) new Object[capacity];
System.arraycopy(keys, 0, newKeys, 0, size);
System.arraycopy(values, 0, newValues, 0, size);
keys = newKeys;
values = newValues;
}
// 获取符号表的大小
public int size() {
return size;
}
// 判断符号表是否为空
public boolean isEmpty() {
return size == 0;
}
}
OrderedSymbolTableTest 类:
java
package suanfa;
public class OrderedSymbolTableTest {
public static void main(String[] args) {
// 创建一个有序符号表,键为 Integer,值为 String
OrderedSymbolTable<Integer, String> symbolTable = new OrderedSymbolTable<>();
// 插入一些键值对
symbolTable.put(1, "one");
symbolTable.put(2, "two");
symbolTable.put(3, "three");
symbolTable.put(4, "four");
// 输出符号表的大小
System.out.println("符号表的大小: " + symbolTable.size()); // 输出 4
// 获取某个键对应的值
System.out.println("键 3 对应的值: " + symbolTable.get(3)); // 输出 "three"
// 删除键 2 的键值对
symbolTable.delete(2);
// 输出符号表的大小
System.out.println("删除键 2 后符号表的大小: " + symbolTable.size()); // 输出 3
// 查看删除后的符号表
System.out.println("键 2 对应的值: " + symbolTable.get(2)); // 输出 null
}
}
录制: untitled2 – Insertion.java
录制文件:https://meeting.tencent.com/crm/KzGGkGE85d
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本