《算法》第三章部分程序 part 4

? 书中第三章部分程序,加上自己补充的代码,包括散列表、线性探查表

● 散列表

  1 package package01;
  2
  3 import edu.princeton.cs.algs4.Queue;
  4 import edu.princeton.cs.algs4.SequentialSearchST;
  5 import edu.princeton.cs.algs4.StdIn;
  6 import edu.princeton.cs.algs4.StdOut;
  7
  8 public class class01<Key, Value>
  9 {
 10     private static final int INIT_CAPACITY = 4;   // 默认构造函数参数
 11     private int n;                                // 待插入元素数
 12     private int m;                                // 散列表尺寸
 13     private SequentialSearchST<Key, Value>[] st;  // 散列表
 14
 15     public class01()
 16     {
 17         this(INIT_CAPACITY);
 18     }
 19
 20     public class01(int capacity)
 21     {
 22         m = capacity;
 23         st = (SequentialSearchST<Key, Value>[]) new SequentialSearchST[m];
 24         for (int i = 0; i < m; i++)
 25             st[i] = new SequentialSearchST<Key, Value>();
 26     }
 27
 28     public int size()
 29     {
 30         return n;
 31     }
 32
 33     public boolean isEmpty()
 34     {
 35         return size() == 0;
 36     }
 37
 38     private void resize(int capacity)
 39     {
 40         class01<Key, Value> temp = new class01<Key, Value>(capacity);
 41         for (int i = 0; i < m; i++)
 42         {
 43             for (Key key : st[i].keys())
 44                 temp.put(key, st[i].get(key));
 45         }
 46         m = temp.m;
 47         n = temp.n;
 48         st = temp.st;
 49     }
 50
 51     public boolean contains(Key key)
 52     {
 53         if (key == null)
 54             throw new IllegalArgumentException("\n<contains> key == null.\n");
 55         return get(key) != null;
 56     }
 57
 58     private int hash(Key key)
 59     {
 60         return (key.hashCode() & 0x7fffffff) % m;
 61     }
 62
 63     public Value get(Key key)
 64     {
 65         if (key == null)
 66             throw new IllegalArgumentException("\n<get> key == null.\n");
 67         return st[hash(key)].get(key);
 68     }
 69
 70     public void put(Key key, Value val)
 71     {
 72         if (key == null)
 73             throw new IllegalArgumentException("\n<get> key == null.\n");
 74         if (val == null)
 75         {
 76             delete(key);
 77             return;
 78         }
 79         if (n >= 10 * m)                        // 平均链表长度不小于 10,扩容
 80             resize(2 * m);
 81         int i = hash(key);
 82         if (!st[i].contains(key))
 83             n++;
 84         st[i].put(key, val);
 85     }
 86
 87     public void delete(Key key)
 88     {
 89         if (key == null)
 90             throw new IllegalArgumentException("\n<delete> key == null.\n");
 91         if (!contains(key))
 92             return;
 93         int i = hash(key);
 94         if (st[i].contains(key))
 95             n--;
 96         st[i].delete(key);
 97         if (m > INIT_CAPACITY && n <= 2 * m)    // 平均链表长度小于 2,缩容
 98             resize(m / 2);
 99     }
100
101     public Iterable<Key> keys()
102     {
103         Queue<Key> queue = new Queue<Key>();
104         for (int i = 0; i < m; i++)
105         {
106             for (Key key : st[i].keys())
107                 queue.enqueue(key);
108         }
109         return queue;
110     }
111
112     public static void main(String[] args)
113     {
114         class01<String, Integer> st = new class01<String, Integer>();
115         for (int i = 0; !StdIn.isEmpty(); i++)
116         {
117             String key = StdIn.readString();
118             st.put(key, i);
119         }
120         for (String s : st.keys())
121             StdOut.println(s + " " + st.get(s));
122     }
123 }

● 线性探查表

  1 package package01;
  2
  3 import edu.princeton.cs.algs4.Queue;
  4 import edu.princeton.cs.algs4.StdIn;
  5 import edu.princeton.cs.algs4.StdOut;
  6
  7 public class class01<Key, Value>
  8 {
  9     private static final int INIT_CAPACITY = 4;
 10     private int n;
 11     private int m;
 12     private Key[] keys;
 13     private Value[] vals;
 14
 15     public class01()
 16     {
 17         this(INIT_CAPACITY);
 18     }
 19
 20     public class01(int capacity)
 21     {
 22         m = capacity;
 23         n = 0;
 24         keys = (Key[])   new Object[m];
 25         vals = (Value[]) new Object[m];
 26     }
 27
 28     public int size()
 29     {
 30         return n;
 31     }
 32
 33     public boolean isEmpty()
 34     {
 35         return size() == 0;
 36     }
 37
 38     private void resize(int capacity)
 39     {
 40         class01<Key, Value> temp = new class01<Key, Value>(capacity);
 41         for (int i = 0; i < m; i++)
 42         {
 43             if (keys[i] != null)
 44                 temp.put(keys[i], vals[i]);
 45         }
 46         m = temp.m;
 47         keys = temp.keys;
 48         vals = temp.vals;
 49
 50     }
 51
 52     public boolean contains(Key key)
 53     {
 54         if (key == null)
 55             throw new IllegalArgumentException("\n<contains> key == null.\n");
 56         return get(key) != null;
 57     }
 58
 59     private int hash(Key key)
 60     {
 61         return (key.hashCode() & 0x7fffffff) % m;
 62     }
 63
 64     public Value get(Key key)
 65     {
 66         if (key == null)
 67             throw new IllegalArgumentException("\n<get> key == null.\n");
 68         for (int i = hash(key); keys[i] != null; i = (i + 1) % m)   // 表荷载不会超过 1/2,所以不会绕圈
 69         {
 70             if (keys[i].equals(key))
 71                 return vals[i];
 72         }
 73         return null;
 74     }
 75
 76     public void put(Key key, Value val)
 77     {
 78         if (key == null)
 79             throw new IllegalArgumentException("\n<get> key == null.\n");
 80         if (val == null)
 81         {
 82             delete(key);
 83             return;
 84         }
 85         if (n >= m / 2)                                             // 荷载超过一半了,扩容
 86             resize(2 * m);
 87         int i;
 88         for (i = hash(key); keys[i] != null; i = (i + 1) % m)
 89         {
 90             if (keys[i].equals(key))
 91             {
 92                 vals[i] = val;
 93                 return;
 94             }
 95         }
 96         keys[i] = key;
 97         vals[i] = val;
 98         n++;
 99     }
100
101     public void delete(Key key)
102     {
103         if (key == null)
104             throw new IllegalArgumentException("\n<delete> key == null.\n");
105         if (!contains(key))
106             return;
107         int i = hash(key);
108         for (; !key.equals(keys[i]); i = (i + 1) % m);              // 找到目标元素
109         keys[i] = null;                                             // 删除目标元素
110         vals[i] = null;
111         for (i = (i + 1) % m; keys[i] != null; i = (i + 1) % m)     // 在下一个 null 之前,所有元素重新插入
112         {
113             Key   keyToRehash = keys[i];
114             Value valToRehash = vals[i];
115             keys[i] = null;
116             vals[i] = null;
117             n--;
118             put(keyToRehash, valToRehash);
119         }
120         n--;
121         if (n > 0 && n <= m / 8)                                    // 荷载小于 1/8, 缩容
122             resize(m / 2);
123     }
124
125     public Iterable<Key> keys()
126     {
127         Queue<Key> queue = new Queue<Key>();
128         for (int i = 0; i < m; i++)
129         {
130             if (keys[i] != null)
131                 queue.enqueue(keys[i]);
132         }
133         return queue;
134     }
135     private boolean check()
136     {
137         if (m < 2 * n)                                      // 检查容量
138         {
139             System.err.println("\n<check> m < 2 * n.\n");
140             return false;
141         }
142         for (int i = 0; i < m; i++)                         // 检查 hash
143         {
144             if (keys[i] == null)
145                 continue;
146             if (get(keys[i]) != vals[i])
147             {
148                 System.err.println("\n<check> hash error at i = ", i, ", key[i] = ", get(keys[i]), ", val[i] = ", vals[i], ".\n");
149                 return false;
150             }
151         }
152         return true;
153     }
154
155     public static void main(String[] args)
156     {
157         class01<String, Integer> st = new class01<String, Integer>();
158         for (int i = 0; !StdIn.isEmpty(); i++)
159         {
160             String key = StdIn.readString();
161             st.put(key, i);
162         }
163         for (String s : st.keys())
164             StdOut.println(s + " " + st.get(s));
165     }
166 }

原文地址:https://www.cnblogs.com/cuancuancuanhao/p/9795423.html

时间: 2024-10-13 03:07:25

《算法》第三章部分程序 part 4的相关文章

《算法》第三章部分程序 part 5

? 书中第三章部分程序,加上自己补充的代码,包含公共符号表.集合类型 ● 公共符号表,用于普通查找表的基本类 1 package package01; 2 3 import java.util.NoSuchElementException; 4 import java.util.TreeMap; 5 import edu.princeton.cs.algs4.StdIn; 6 import edu.princeton.cs.algs4.StdOut; 7 8 public class class

《算法》第三章部分程序 part 6

? 书中第三章部分程序,加上自己补充的代码,包含双向索引表.文建索引.稀疏向量类型 ● 双向索引表 1 package package01; 2 3 import edu.princeton.cs.algs4.ST; 4 import edu.princeton.cs.algs4.Queue; 5 import edu.princeton.cs.algs4.In; 6 import edu.princeton.cs.algs4.StdIn; 7 import edu.princeton.cs.a

第三章—Windows程序

这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂 本章的名字就叫<Windows程序>而不是<Windows程序设计>所以,我只是讲一些关于Windows程序运作的原理: Windows 为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来.也就是这一个又一个窗口

Python编程入门-第三章 编写程序 -学习笔记

第三章 编写程序 1.编辑源程序.运行程序 可通过IDLE中File>New File新建一个文本以编辑源程序,编辑完成可通过Run>Run Module(或者F5快捷键)来运行程序.Python源文件都以.py格式存储. 2.从命令行运行程序 除了上述利用IDLE的集成功能运行程序的方式外,当然也可以通过命令行运行程序,命令格式为:python ‘源文件名称.py’. 3.编译源代码 当运行py格式文件时,Python会自动创建相应的.pyc文件,该文件包含编译后的代码即目标代码,目标代码基

算法第三章上机实验

算法第三章上机实验 数字三角形 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. #include <iostream> using namespace std; int maxsum(int a[100][100],int n){ int b[100][100]={0}; for(int i=n-1;i>=0;i--){ for(int j=i;j>=0;j--){

揭露动态规划真面目——算法第三章上机实践报告

算法第三章上机实践报告 一.        实践题目 7-2 最大子段和 (40 分) 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5

《算法》第一章部分程序

? 书中第一章部分程序,加上自己补充的代码.包括若干种二分搜索和寻找图上连通分量数的两种算法. ● 代码,二分搜索 1 package package01; 2 3 import java.util.Arrays; 4 import edu.princeton.cs.algs4.StdRandom; 5 6 public class class01 7 { 8 public int binarySearch(int [] a, int target) // 非递归实现 9 { 10 int lp

算法第三章上机实践报告——动态规划

1.实践题目 7-1 数字三角形 (30 分) 给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 输入格式: 输入有n+1行: 第 1 行是数字三角形的行数 n,1<=n<=100. 接下来 n行是数字三角形各行中的数字.所有数字在0..99 之间. 输出格式: 输出最大路径的值. 输入样例: 在这里给出一组输入.例如: 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6

第三章--Win32程序的执行单元(部分概念及代码讲解)(中-线程同步

学习<Windows程序设计>记录 概念贴士: 1. 同步可以保证在一个时间内只有一个线程对其共享资源有控制权.PS:共享资源包括全局变量.公共数据成员或者句柄等. 2. 临界区内核对象和时间内核对象可以很好地用于多线程同步和它们之间的通信. 3. 线程同步必要性:当多个线程在同一个进程中执行时,可能有不止一个线程同时执行同一段代码,访问同一段内存中的数据.多个线程同时读取共享数据没有问题,但是如果同时读写,情况就不同,也许会产生极大的错误.(如:程序CountErr).解决同步问题,就是保证