《算法》第三章部分程序 part 4
▶ 书中第三章部分程序,加上自己补充的代码,包括散列表、线性探查表
● 散列表
- package package01;
- import edu.princeton.cs.algs4.Queue;
- import edu.princeton.cs.algs4.SequentialSearchST;
- import edu.princeton.cs.algs4.StdIn;
- import edu.princeton.cs.algs4.StdOut;
- public class class01<Key, Value>
- {
- private static final int INIT_CAPACITY = 4; // 默认构造函数参数
- private int n; // 待插入元素数
- private int m; // 散列表尺寸
- private SequentialSearchST<Key, Value>[] st; // 散列表
- public class01()
- {
- this(INIT_CAPACITY);
- }
- public class01(int capacity)
- {
- m = capacity;
- st = (SequentialSearchST<Key, Value>[]) new SequentialSearchST[m];
- for (int i = 0; i < m; i++)
- st[i] = new SequentialSearchST<Key, Value>();
- }
- public int size()
- {
- return n;
- }
- public boolean isEmpty()
- {
- return size() == 0;
- }
- private void resize(int capacity)
- {
- class01<Key, Value> temp = new class01<Key, Value>(capacity);
- for (int i = 0; i < m; i++)
- {
- for (Key key : st[i].keys())
- temp.put(key, st[i].get(key));
- }
- m = temp.m;
- n = temp.n;
- st = temp.st;
- }
- public boolean contains(Key key)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<contains> key == null.\n");
- return get(key) != null;
- }
- private int hash(Key key)
- {
- return (key.hashCode() & 0x7fffffff) % m;
- }
- public Value get(Key key)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<get> key == null.\n");
- return st[hash(key)].get(key);
- }
- public void put(Key key, Value val)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<get> key == null.\n");
- if (val == null)
- {
- delete(key);
- return;
- }
- if (n >= 10 * m) // 平均链表长度不小于 10,扩容
- resize(2 * m);
- int i = hash(key);
- if (!st[i].contains(key))
- n++;
- st[i].put(key, val);
- }
- public void delete(Key key)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<delete> key == null.\n");
- if (!contains(key))
- return;
- int i = hash(key);
- if (st[i].contains(key))
- n--;
- st[i].delete(key);
- if (m > INIT_CAPACITY && n <= 2 * m) // 平均链表长度小于 2,缩容
- resize(m / 2);
- }
- public Iterable<Key> keys()
- {
- Queue<Key> queue = new Queue<Key>();
- for (int i = 0; i < m; i++)
- {
- for (Key key : st[i].keys())
- queue.enqueue(key);
- }
- return queue;
- }
- public static void main(String[] args)
- {
- class01<String, Integer> st = new class01<String, Integer>();
- for (int i = 0; !StdIn.isEmpty(); i++)
- {
- String key = StdIn.readString();
- st.put(key, i);
- }
- for (String s : st.keys())
- StdOut.println(s + " " + st.get(s));
- }
- }
● 线性探查表
- package package01;
- import edu.princeton.cs.algs4.Queue;
- import edu.princeton.cs.algs4.StdIn;
- import edu.princeton.cs.algs4.StdOut;
- public class class01<Key, Value>
- {
- private static final int INIT_CAPACITY = 4;
- private int n;
- private int m;
- private Key[] keys;
- private Value[] vals;
- public class01()
- {
- this(INIT_CAPACITY);
- }
- public class01(int capacity)
- {
- m = capacity;
- n = 0;
- keys = (Key[]) new Object[m];
- vals = (Value[]) new Object[m];
- }
- public int size()
- {
- return n;
- }
- public boolean isEmpty()
- {
- return size() == 0;
- }
- private void resize(int capacity)
- {
- class01<Key, Value> temp = new class01<Key, Value>(capacity);
- for (int i = 0; i < m; i++)
- {
- if (keys[i] != null)
- temp.put(keys[i], vals[i]);
- }
- m = temp.m;
- keys = temp.keys;
- vals = temp.vals;
- }
- public boolean contains(Key key)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<contains> key == null.\n");
- return get(key) != null;
- }
- private int hash(Key key)
- {
- return (key.hashCode() & 0x7fffffff) % m;
- }
- public Value get(Key key)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<get> key == null.\n");
- for (int i = hash(key); keys[i] != null; i = (i + 1) % m) // 表荷载不会超过 1/2,所以不会绕圈
- {
- if (keys[i].equals(key))
- return vals[i];
- }
- return null;
- }
- public void put(Key key, Value val)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<get> key == null.\n");
- if (val == null)
- {
- delete(key);
- return;
- }
- if (n >= m / 2) // 荷载超过一半了,扩容
- resize(2 * m);
- int i;
- for (i = hash(key); keys[i] != null; i = (i + 1) % m)
- {
- if (keys[i].equals(key))
- {
- vals[i] = val;
- return;
- }
- }
- keys[i] = key;
- vals[i] = val;
- n++;
- }
- public void delete(Key key)
- {
- if (key == null)
- throw new IllegalArgumentException("\n<delete> key == null.\n");
- if (!contains(key))
- return;
- int i = hash(key);
- for (; !key.equals(keys[i]); i = (i + 1) % m); // 找到目标元素
- keys[i] = null; // 删除目标元素
- vals[i] = null;
- for (i = (i + 1) % m; keys[i] != null; i = (i + 1) % m) // 在下一个 null 之前,所有元素重新插入
- {
- Key keyToRehash = keys[i];
- Value valToRehash = vals[i];
- keys[i] = null;
- vals[i] = null;
- n--;
- put(keyToRehash, valToRehash);
- }
- n--;
- if (n > 0 && n <= m / 8) // 荷载小于 1/8, 缩容
- resize(m / 2);
- }
- public Iterable<Key> keys()
- {
- Queue<Key> queue = new Queue<Key>();
- for (int i = 0; i < m; i++)
- {
- if (keys[i] != null)
- queue.enqueue(keys[i]);
- }
- return queue;
- }
- private boolean check()
- {
- if (m < 2 * n) // 检查容量
- {
- System.err.println("\n<check> m < 2 * n.\n");
- return false;
- }
- for (int i = 0; i < m; i++) // 检查 hash
- {
- if (keys[i] == null)
- continue;
- if (get(keys[i]) != vals[i])
- {
- System.err.println("\n<check> hash error at i = ", i, ", key[i] = ", get(keys[i]), ", val[i] = ", vals[i], ".\n");
- return false;
- }
- }
- return true;
- }
- public static void main(String[] args)
- {
- class01<String, Integer> st = new class01<String, Integer>();
- for (int i = 0; !StdIn.isEmpty(); i++)
- {
- String key = StdIn.readString();
- st.put(key, i);
- }
- for (String s : st.keys())
- StdOut.println(s + " " + st.get(s));
- }
- }
《算法》第三章部分程序 part 4的更多相关文章
- 《算法》第三章部分程序 part 6
▶ 书中第三章部分程序,加上自己补充的代码,包含双向索引表.文建索引.稀疏向量类型 ● 双向索引表 package package01; import edu.princeton.cs.algs4.S ...
- 《算法》第三章部分程序 part 5
▶ 书中第三章部分程序,加上自己补充的代码,包含公共符号表.集合类型 ● 公共符号表,用于普通查找表的基本类 package package01; import java.util.NoSuchEle ...
- 《算法》第三章部分程序 part 3
▶ 书中第三章部分程序,加上自己补充的代码,红黑树 ● 红黑树,大部分方法与注释与二叉树相同 package package01; import java.util.NoSuchElementExce ...
- 《算法》第三章部分程序 part 2
▶ 书中第三章部分程序,加上自己补充的代码,平衡二叉搜索树 ● 平衡二叉搜索树 package package01; import java.util.NoSuchElementException; ...
- 《算法》第三章部分程序 part 1
▶ 书中第三章部分程序,加上自己补充的代码,包括单词频率统计,(单链表)顺序查找表,二分查找表 ● 单词频率统计 package package01; import edu.princeton.cs. ...
- 《算法》第二章部分程序 part 3
▶ 书中第二章部分程序,加上自己补充的代码,包括各种优化的快排 package package01; import edu.princeton.cs.algs4.In; import edu.prin ...
- 《算法》第一章部分程序 part 1
▶ 书中第一章部分程序,加上自己补充的代码,包括若干种二分搜索,寻找图上连通分量数的两种算法 ● 代码,二分搜索 package package01; import java.util.Arrays; ...
- 《算法》第二章部分程序 part 5
▶ 书中第二章部分程序,加上自己补充的代码,包括利用优先队列进行多路归并和堆排序 ● 利用优先队列进行多路归并 package package01; import edu.princeton.cs.a ...
- 《算法》第二章部分程序 part 4
▶ 书中第二章部分程序,加上自己补充的代码,包括优先队列和索引优先队列 ● 优先队列 package package01; import java.util.Comparator; import ja ...
随机推荐
- linux与Windows使用编译区别及makefile文件编写
一.Windows与:Linux嵌入式开发区别 Windows下编辑.编译.执行 编辑: sourceInsight:ADS: 编译:指定链接地址,指定链接顺序,编译 执行:烧写到单板再启动 Linu ...
- mysql 高可用架构
什么是高可用 不可用出现的情况 如何实现高可用 第一种方法 第二种方法 MMM 和 MHA MHA更好的处理方式 安装步骤 优缺点 读写分离
- 让SQL SERVER自动清理掉处于SLEEPING状态超过30分钟的进程(转)
原文地址:http://www.itpub.net/thread-809758-1-1.html use master go ) drop procedure [dbo].[p_killspid] G ...
- GoJS拖动设计
http://192.168.0.149:8035/gojs/intro/groups.html http://192.168.0.149:8035/gojs/intro/ports.html htt ...
- Java序列化的理解与学习
1.什么是Java序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比 JVM的生命周期更长.但在现实应 ...
- ==和is
is是比较两个引用是否指向了同一个对象(引用比较) ==是比较两个对象是否相等 数字在:-5~256之间的时候用来赋值的内存地址是不变的
- Python——ipython(python programming)
Tab自动补充 Ctrl+c中断程序 ?帮助调出文档 _得到上次的结果 ,__的到上上次结果,___得到上上次结果 %开头的为魔术命令 %timeit 得到运算时间,多次求平均 %%time ...
- JSON: 介绍、应用
ylbtech-JSON: 介绍.应用 JSONP(JSON with Padding)是 JSON 的一种“使用模式”,可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从不同的 ...
- [UE4]Return Node节点好用法
蓝图自定义函数中,碰到“Return Node”也会推出当前的函数,跟高级语言的“return”是一样的用法
- sqlserver创建数据库
--指向当前要使用的master数据库,向master数据库中注册创建信息 use master go --创建数据库 create database StudentManageDB on prima ...