第十八天算法设计

OrderedSymbolTable 类:
java
package suanfa;

import java.util.Arrays;

public class OrderedSymbolTable<K extends Comparable, V> {
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

posted @   申shen  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示