提交 f4db54e6 编写于 作者: W wizardforcel

ch11

上级 dc492583
......@@ -17,7 +17,7 @@
如果每个子映射的条目数是不变的,我们可以在常数时间内搜索一个子映射。并且计算散列函数通常是常数时间(它可能取决于键的大小,但不取决于键的数量)。这使得`Map`的核心方法, `put``get`时间不变。
在下一个练习中,将看到细节。
在下一个练习中,将看到细节。
## 11.1 练习 9
......@@ -50,7 +50,7 @@ public class MyHashMap<K, V> extends MyBetterMap<K, V> implements Map<K, V> {
运行`ant build`来编译源文件。然后运行`ant MyHashMapTest`。它应该失败,因为执行`rehash`会抛出异常。你的工作是填充它。
填充`rehash`的主体,来收集表中的条目,调整表的大小,然后重新放入条目。我提供了两种可能会派上用场的方法:`MyBetterMap.makeMaps``MyLinearMap.getEntries`。每次调用它时,的解决方案应该使映射数量加倍。
填充`rehash`的主体,来收集表中的条目,调整表的大小,然后重新放入条目。我提供了两种可能会派上用场的方法:`MyBetterMap.makeMaps``MyLinearMap.getEntries`。每次调用它时,的解决方案应该使映射数量加倍。
## 11.2 分析`MyHashMap`
......@@ -129,12 +129,12 @@ public class MyHashMap<K, V> extends MyBetterMap<K, V> implements Map<K, V> {
运行`ant build`来编译源文件。然后运行`ant ProfileMapPut`。它使用一系列问题规模,测量 `HashMap.put`(由 Java 提供)的运行时间,并在重对数比例尺上绘制运行时间与问题规模。如果这个操作是常数时间,`n`个操作的总时间应该是线性的,所以结果应该是斜率为`1`的直线。当我运行这个代码时,估计的斜率接近`1`,这与我们的分析一致。你应该得到类似的东西。
修改`ProfileMapPut.java`,来测量您的`MyHashMap`实现,而不是 Java 的`HashMap`。再次运行分析器,查看斜率是否接近`1`。您可能需要调整`startN``endMillis`,来找到一系列问题规模,其中运行时间多于几毫秒,但不超过几秒。
修改`ProfileMapPut.java`,来测量你的`MyHashMap`实现,而不是 Java 的`HashMap`。再次运行分析器,查看斜率是否接近`1`。你可能需要调整`startN``endMillis`,来找到一系列问题规模,其中运行时间多于几毫秒,但不超过几秒。
当我运行这个代码时,我感到惊讶:斜率大约为`1.7`,这表明这个实现不是一直都是常数的。它包含一个“性能错误”。
在阅读下一节之前,应该跟踪错误,修复错误,并确认现在`put`是常数时间,符合预期。
在阅读下一节之前,应该跟踪错误,修复错误,并确认现在`put`是常数时间,符合预期。
## 11.5 修复`MyHashMap`
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册