Skip to content

Gh pages 1.0 #18

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Apr 24, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 91 additions & 35 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
将利用碎片时间进行整理和校对,完整的时间段适合做其他需要大量思考的事,如果你有兴趣欢迎提交PR。

## TODO
- 目录完善
- 数据校对

## 目录
Expand All @@ -28,43 +27,100 @@
* [2.5 数组](hc02/05_Arrays.md#数组)
* [2.6 通配符与类型参数](ch02/06_Wildcards_Versus_Type_Parameters.md#通配符与类型参数)
* [2.7 通配符捕获](ch02/07_Wildcard_Capture.md#通配符捕获)
* [2.8 对通配符的限制](ch02/08_Restrictions_on_Wildcards.md)
* [第三章(集合类)](ch03/00_Comparison_and_Bounds.md)
* [3.1 可比较的](ch03/01_Comparable.md)
* [3.2 集合的最大值](ch03/02_Maximum_of_a_Collection.md)
* [3.3 水果相关示例](ch03/03_A_Fruity_Example.md)
* [3.4 比较](ch03/04_Comparator.md)
* [3.5 枚举类型](ch03/05_Enumerated_Types.md)
* [3.6 多重界限](ch03/06_Multiple_Bounds.md)
* [3.7 桥梁](ch03/07_Bridges.md)
* [3.8 协变覆盖](ch03/08_Covariant_Overriding.md)
* [第四章(声明)](ch04/00_Declarations.md)
* [4.1 构造函数](ch04/01_Constructors.md)
* [4.2 静态成员](ch04/02_Static_Members.md)
* [4.3 嵌套类](ch04/03_Nested_Classes.md)
* [4.4 擦除的工作原理](ch04/04_How_Erasure_Works.md)
* [第五章(进化,而不是革命)](ch05/00_Evolution_Not_Revolution.md)
* [5.1 旧版客户端的旧版库](ch05/01_Legacy_Library_with_Legacy_Client.md)
* [5.2 具有通用客户端的通用库](ch05/02_Generic_Library_with_Generic_Client.md)
* [5.3 具有传统客户端的通用库](ch05/03_Generic_Library_with_Legacy_Client.md)
* [5.4 具有通用客户端的旧版库](ch05/04_Legacy_Library_with_Generic_Client.md)
* [5.5 结论](ch05/05_Conclusions.md)
* [第六章(具体化)](ch06/00_Reification.md)
* [6.1 可定义类型](ch06/01_Reifiable_Types.md)
* [6.2 实例测试和示例](ch06/02_Instance_Tests_and_Casts.md)
* [6.3 异常处理](ch06/03_Exception_Handling.md)
* [6.4 数组创建](ch06/04_Array_Creation.md)
* [6.5 广告中的真理原则](ch06/05_The_Principle_of_Truth_in_Advertising.md)
* [6.6 不雅暴露的原则](ch06/06_The_Principle_of_Indecent_Exposure.md)
* [6.7 如何定义 ArrayList](ch06/07_How_to_Define_ArrayList.md)
* [6.8 数组创建和可变参数](ch06/08_Array_Creation_and_Varargs.md)
* [6.9 作为已弃用类型的阵列](ch06/09_Arrays_as_a_Deprecated_Type.md)
* [6.10 加起来](ch06/10_Summing_Up.md)

* [2.8 对通配符的限制](ch02/08_Restrictions_on_Wildcards.md#对通配符的限制)
* [第三章(集合类)](ch03/00_Comparison_and_Bounds.md#集合类)
* [3.1 可比较的](ch03/01_Comparable.md#可比较的)
* [3.2 集合的最大值](ch03/02_Maximum_of_a_Collection.md#集合的最大值)
* [3.3 水果相关示例](ch03/03_A_Fruity_Example.md#水果相关示例)
* [3.4 比较](ch03/04_Comparator.md#比较)
* [3.5 枚举类型](ch03/05_Enumerated_Types.md#枚举类型)
* [3.6 多重界限](ch03/06_Multiple_Bounds.md#多重界限)
* [3.7 桥梁](ch03/07_Bridges.md#桥梁)
* [3.8 协变覆盖](ch03/08_Covariant_Overriding.md#协变覆盖)
* [第四章(声明)](ch04/00_Declarations.md#声明)
* [4.1 构造函数](ch04/01_Constructors.md#构造函数)
* [4.2 静态成员](ch04/02_Static_Members.md#静态成员)
* [4.3 嵌套类](ch04/03_Nested_Classes.md#嵌套类)
* [4.4 擦除的工作原理](ch04/04_How_Erasure_Works.md#擦除的工作原理)
* [第五章(进化,而不是革命)](ch05/00_Evolution_Not_Revolution.md#进化,而不是革命)
* [5.1 旧版客户端的旧版库](ch05/01_Legacy_Library_with_Legacy_Client.md#旧版客户端的旧版库)
* [5.2 具有通用客户端的通用库](ch05/02_Generic_Library_with_Generic_Client.md#具有通用客户端的通用库)
* [5.3 具有传统客户端的通用库](ch05/03_Generic_Library_with_Legacy_Client.md#具有传统客户端的通用库)
* [5.4 具有通用客户端的旧版库](ch05/04_Legacy_Library_with_Generic_Client.md#具有通用客户端的旧版库)
* [5.5 结论](ch05/05_Conclusions.md#结论)
* [第六章(具体化)](ch06/00_Reification.md#具体化)
* [6.1 可定义类型](ch06/01_Reifiable_Types.md#可定义类型)
* [6.2 实例测试和示例](ch06/02_Instance_Tests_and_Casts.md#实例测试和示例)
* [6.3 异常处理](ch06/03_Exception_Handling.md#异常处理)
* [6.4 数组创建](ch06/04_Array_Creation.md#数组创建)
* [6.5 广告中的真理原则](ch06/05_The_Principle_of_Truth_in_Advertising.md#广告中的真理原则)
* [6.6 不雅暴露的原则](ch06/06_The_Principle_of_Indecent_Exposure.md#不雅暴露的原则)
* [6.7 如何定义ArrayList](ch06/07_How_to_Define_ArrayList.md#如何定义ArrayList)
* [6.8 数组创建和可变参数](ch06/08_Array_Creation_and_Varargs.md#数组创建和可变参数)
* [6.9 作为已弃用类型的阵列](ch06/09_Arrays_as_a_Deprecated_Type.md#作为已弃用类型的阵列)
* [6.10 加起来](ch06/10_Summing_Up.md#加起来)
* [第七章(反射)](ch07/00_Reflection.md#反射)
* [7.1 反射的泛型](ch07/01_Generics_for_Reflection.md#反射的泛型)
* [7.2 反射类型是可维持类型](ch07/02_Reflected_Types_are_Reifiable_Types.md#反射类型是可维持类型)
* [7.3 对原始类型的反思](ch07/03_Reflection_for_Primitive_Types.md#对原始类型的反思)
* [7.4 一个通用的反射库](ch07/04_A_Generic_Reflection_Library.md#一个通用的反射库)
* [7.5 泛型的反思](ch07/05_Reflection_for_Generics.md#泛型的反思)
* [7.6 反思泛型类型](ch07/06_Reflecting_Generic_Types.md#反思泛型类型)
* [第八章(有效的泛型)](ch08/00_Effective_Generics.md#有效的泛型)
* [8.1 调用遗留代码时要小心](ch08/01_Take_Care_when_Callin_Legacy_Code.md#调用遗留代码时要小心)
* [8.2 使用选中的集合来强化安全性](ch08/02_Use_Checked_Collections_to_Enforce_Security.md#使用选中的集合来强化安全性)
* [8.3 专注于创建可维持类型](ch08/03_Specialize_to_Create_Reifiable_Types.md#专注于创建可维持类型)
* [8.4 保持二进制兼容性](ch08/04_Maintain_Binary_Compatibility.md#保持二进制兼容性)
* [第九章(设计模式)](ch09/00_Design_Patterns.md#设计模式)
* [9.1 游客](ch09/01_Visitor.md#游客)
* [9.2 翻译员](ch09/02_Interpreter.md#翻译员)
* [9.3 功能](ch09/03_Function.md#功能)
* [9.4 策略](ch09/04_Strategy.md#策略)
* [9.5 主题观察者](ch09/05_Subject-Observer.md#主题观察者)
* [第二部分:集合](ch10/00_Collections.md#集合)
* [第十章(集合)](ch10/00_Collections.md#集合)
* [10.1 Java集合框架的主要接口](ch10/01_The_Main_Interfaces_of_the_Java.md#Java集合框架的主要接口)
* [第十一章(初步措施)](ch11/00_Preliminaries.md#初步措施)
* [11.1 可迭代和迭代器](ch11/01_Iterable_and_Iterators.md)
* [11.2 实现](ch11/02_Implementations.md)
* [11.3 效率与Ο符号](ch11/03_Efficiency_and_the_O-Notation.md#效率与Ο符号)
* [11.4 契约](ch11/04_contract.md#契约)
* [11.5 集合和线程安全](ch11/05_Collections_and_Thread_Safety.md#集合和线程安全)
* [第十二章(集合接口)](ch12/00_The_Collection_Interface.md#集合接口)
* [12.1 使用集合方法](ch12/01_Using_the_Methods_of_Collection.md#使用集合方法)
* [12.2 集合实现](ch12/02_Implementing_Collection.md#集合实现)
* [12.3 集合构造函数](ch12/03_Collection_Constructors.md#集合构造函数)
* [第十三章(Sets)](ch13/00_Sets.md#Sets)
* [13.1 实现Set](ch13/01_Implementing_Set.md#实现Set)
* [13.2 SortedSet和NavigableSet](ch13/02_SortedSet_and_NavigableSet.md#SortedSet和NavigableSet)
* [第十四章(Queues)](ch14/00_Queues.md#Queues)
* [14.1 使用队列方法](ch14/01_Using_the_Methods_of_Queue.md#使用队列方法)
* [14.2 队列的实现](ch14/02_Implementing_Queue.md#队列的实现)
* [14.3 BlockingQueue](ch14/03_BlockingQueue.md#BlockingQueue)
* [14.4 Deque](ch14/04_Deque.md#Deque)
* [14.5 比较队列实现](ch14/05_Comparing_Queue_Implementations.md#比较队列实现)
* [第十五章(Lists)](ch15/00_Lists.md#Lists)
* [15.1 使用List的方法](ch15/01_Using_the_Methods_of_List.md#使用List的方法)
* [15.2 实现List](ch15/02_Implementing_List.md#实现List)
* [15.3 比较List实现](ch15/03_Comparing_List_Implementations.md#比较List实现)
* [第十六章(Maps)](ch16/00_Maps.md#Maps)
* [16.1 使用Map的方法](ch16/01_Using_the_Methods_of_Map.md#使用Map的方法)
* [16.2 实现Map](ch16/02_Implementing_Map.md#实现Map)
* [16.3 SortedMap和NavigableMap](ch16/03_SortedMap_and_NavigableMap.md#SortedMap和NavigableMap)
* [16.4 ConcurrentMap](ch16/04_ConcurrentMap.md#ConcurrentMap)
* [16.5 ConcurrentNavigableMap](ch16/05_ConcurrentNavigableMap.md#ConcurrentNavigableMap)
* [16.6 比较Map的实现](ch16/06_Comparing_Map_Implementations.md#比较Map的实现)
* [第十七章(集合类)](ch17/00_The_Collections_Class.md#集合类)
* [17.1 通用算法](ch17/01_Generic_Algorithms.md#通用算法)
* [17.2 收集工厂](ch17/02_Collection_Factories.md#收集工厂)
* [17.3 包装](ch17/03_Wrappers.md#包装)
* [17.4 其他方法](ch17/04_Other_Methods.md#其他方法)


## PR
提交 PR 前请先确认排版,示例: [中文文案排版](https://github.com/maskleo-doc/chinese-copywriting-guidelines)

## 高清英文版 PDF[下载](https://github.com/maskleo/Java-Generics-and-Collections/files/1634266/Java.pdf)

## LICENSE
![](LICENSE.png)
![](LICENSE.png)
2 changes: 1 addition & 1 deletion ch06/07_How_to_Define_ArrayList.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](06_The_Principle_of_Indecent_Exposure.md)

### 如何定义 ArrayList
### 如何定义ArrayList

我们在其他地方争辩说,通常最好使用列表而不是使用数组。有一些地方这不合适。在极少数情况下,出于效率或兼容性的原因,您将需要使用数组。另外,当然,你需要使
用数组来实现 `ArrayList` 本身。在这里,我们将 `ArrayList` 的实现作为一种模型,在极少情况下需要使用数组。这些实现需要谨慎编写,因为它们必然涉及使用未经
Expand Down
2 changes: 1 addition & 1 deletion ch07/01_Generics_for_Reflection.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](00_Reflection.md)

## 反射的泛型
### 反射的泛型

`Java` 支持自 `1.0` 版以来的反射以及 `1.1` 版以后的类文字。 它们的核心是 `Class` 类,它表示运行时对象类型的信息。 您可以编写一个类型,后跟 `.class` 作为文字,表示与该类型相对应的类标记,并且方法 `getClass` 在每个对象上定义并返回一个类标记,该标记表示该对象在运行时携带的特定类型信息。这里是一个例子:

Expand Down
2 changes: 1 addition & 1 deletion ch07/02_Reflected_Types_are_Reifiable_Types.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](01_Generics_for_Reflection.md)

## 反射类型是可维持类型
### 反射类型是可维持类型

反思使程序可以使用物化类型信息。 因此,必要的是,每个类别标记对应于可确定类型。 如果您尝试反映参数化类型,则会获得相应原始类型的指定信息:

Expand Down
2 changes: 1 addition & 1 deletion ch07/03_Reflection_for_Primitive_Types.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](02_Reflected_Types_are_Reifiable_Types.md)

## 对原始类型的反思
### 对原始类型的反思

`Java` 中的每种类型(包括基元类型和数组类型)都具有类文字和相应的类标记。

Expand Down
2 changes: 1 addition & 1 deletion ch07/04_A_Generic_Reflection_Library.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](03_Reflection_for_Primitive_Types.md)

## 一个通用的反射库
### 一个通用的反射库

正如我们所看到的,粗心使用未经检查的演员阵容可能会导致问题,例如违反广告中的真相原则或不雅暴露原则(参见第 `6.5` 节和第 `6.6` 节)。 最小化使用未经检查的强制转换的一种技术是将它们封装在库中。 该库可以仔细检查以确保其使用未经检查的强制转换是安全的,而调用该库的代码可以没有未经检查的强制转换。 `Sun` 正在考虑添加类似于这里描述的库方法。

Expand Down
2 changes: 1 addition & 1 deletion ch07/05_Reflection_for_Generics.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](04_A_Generic_Reflection_Library.md)

## 泛型的反思
### 泛型的反思

泛型以两种方式改变反射库。 我们已经讨论了反射的泛型,其中 `Java` 为类 `Class<T>` 添加了一个类型参数。 我们现在讨论泛型的反射,其中 `Java` 添加了支
持访问泛型类型的方法和类。
Expand Down
2 changes: 1 addition & 1 deletion ch07/06_Reflecting_Generic_Types.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](05_Reflection_for_Generics.md)

## 反映泛型类型
### 反思泛型类型

反射库提供了一个 `Type` 接口来描述一个通用类型。 有一个类实现了这个接口和四个其他接口来扩展它,对应于五种不同的类型:

Expand Down
2 changes: 1 addition & 1 deletion ch08/01_Take_Care_when_Callin_Legacy_Code.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](00_Effective_Generics.md)

## 调用遗留代码时要小心
### 调用遗留代码时要小心

正如我们所看到的,泛型类型在编译时被检查,而不是运行时。 通常,这正是我们想要的,因为在编译时检查会更早地报告错误,并且不会导致运行时开销。 但是,有时这可能不合适,因为我们无法确定编译时检查是否足够(比如说,因为我们将参数化类型的实例传递给旧客户端或我们不信任的客户端 ),还是因为我们在运行时需要关于类型的信息(比如说,因为我们需要一个可重用类型作为数组组件)。 一个托收集合通常会诀窍,如果不行,我们可以创建一个专门的类。 我们考虑本节中的已检查集合,下一节中的安全问题以及之后的部分中的专门类。

Expand Down
2 changes: 1 addition & 1 deletion ch08/02_Use_Checked_Collections_to_Enforce_Security.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](01_Take_Care_when_Callin_Legacy_Code.md)

## 使用选中的集合来强化安全性
### 使用选中的集合来强化安全性

请注意,通用类型提供的保证仅适用于没有未经检查的警告的情况。 这意味着泛型类型对于确保其他人编写的代码的安全性没有用处,因为您无法知道该代码是否在编译时引发未经检查的警告。

Expand Down
2 changes: 1 addition & 1 deletion ch08/03_Specialize_to_Create_Reifiable_Types.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](02_Use_Checked_Collections_to_Enforce_Security.md)

## 专注于创建可维持类型
### 专注于创建可维持类型

参数化类型不可确定,但某些操作(如实例测试,转换和数组创建仅适用于可重用类型)。 在这种情况下,一种解决方法是创建参数化类型的专用版本。 专业版本可以通过委托(即包装)或继承(即子类化)来创建,我们依次讨论每个版本。

Expand Down
2 changes: 1 addition & 1 deletion ch08/04_Maintain_Binary_Compatibility.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](03_Specialize_to_Create_Reifiable_Types.md)

## 保持二进制兼容性
### 保持二进制兼容性

正如我们强调的那样,泛型是通过擦除来实现的,以缓解进化。当将遗留代码转化为泛型代码时,我们希望确保新生代码能够与任何现有代码一起工作,包括我们没有源代码的类文件。当这种情况发生时,我们说传统和通用版本是二进制兼容的。

Expand Down
2 changes: 1 addition & 1 deletion ch09/01_Visitor.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](00_Design_Patterns.md)

## 游客
### 游客

通常情况下,数据结构由案例分析和递归定义。例如,`Tree<E>` 类型的二叉树是以下之一:

Expand Down
2 changes: 1 addition & 1 deletion ch09/02_Interpreter.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](01_Visitor.md)

## 翻译员
### 翻译员

树的一种用法是用编程语言表示表达式。如前一节所述,表达式类型由一个抽象类表示,每种表达式都由一个子类表示。有一种抽象方法来评估一个表达式,并且每个子类都根据相应的表达式实现该方法。

Expand Down
2 changes: 1 addition & 1 deletion ch09/03_Function.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](02_Interpreter.md)

## 功能
### 功能

函数模式将任意方法转换为对象。函数和相应方法之间的关系类似于 `Comparator` 和 `compareTo` 方法之间的关系。

Expand Down
2 changes: 1 addition & 1 deletion ch09/04_Strategy.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](03_Function.md)

## 策略
### 策略

策略模式用于将方法与对象分离,使您可以提供许多可能的方法实例。我们对战略模式的讨论说明了许多面向对象程序中的结构化技术,即并行类层次结构。我们将通过考虑纳税人如何应用不同的税收策略来说明战略模式。纳税人将会有一个等级制度,并且有一个相关的税收策略等级制度。例如,有一个适用于任何纳税人的默认策略。纳税人的一个子类是信任,而默认策略的一个子类只适用于信任。

Expand Down
2 changes: 1 addition & 1 deletion ch09/05_Subject-Observer.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](04_Strategy.md)

## 主题观察者
### 主题观察者

我们用一个更加扩展的例子来完成,说明通用的 `Subject-Observer` 模式。与策略模式一样,`Subject-Observer` 模式使用并行类层次结构,但这次我们需要两个具有相互递归边界的类型变量,一个代表特定类型的主体,一个代表特定类型的观察者。这是我们的第一个带有相互递归边界的类型变量的例子。

Expand Down
2 changes: 1 addition & 1 deletion ch10/01_The_Main_Interfaces_of_the_Java.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](00_Collections.md)

## Java集合框架的主要接口
### Java集合框架的主要接口

图 `10-1` 显示了 `Java` 集合框架的主要接口,以及另外一个 `Iterable`--它不在框架中,但是它是一个重要的附件。其目的如下:

Expand Down
2 changes: 1 addition & 1 deletion ch11/01_Iterable_and_Iterators.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](00_Preliminaries.md)

## 可迭代和迭代器
### 可迭代和迭代器

迭代器是实现接口迭代器的对象

Expand Down
2 changes: 1 addition & 1 deletion ch11/02_Implementations.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](01_Iterable_and_Iterators.md)

## 实现
### 实现

我们简要地看了一下集合框架的接口,这些接口定义了我们可以预期的每个集合的行为。但正如我们在本章的介绍中提到的,有几种方法可以实现每个接口。为什么框架不会为每个接口使用最佳实现?那肯定会让生活变得更简单 - 事实上,过于简单就像生活一样。如果实施对某些行动来说是灰狗,墨菲定律告诉我们这对其他人来说将是一只乌龟。由于没有任何接口的“最佳”实现,所以您必须进行权衡,判断应用程序中哪些操作最常使用,并选择优化这些操作的实现。

Expand Down
2 changes: 1 addition & 1 deletion ch11/03_Efficiency_and_the_O-Notation.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](02_Implementations.md)

## 效率与Ο符号
### 效率与Ο符号

在最后一节中,我们讨论了不同的实现对于不同的操作是“好的”。一个好的算法在使用两种资源时很经济:时间和空间。集合的实现通常使用与集合大小成正比的空间,但是访问和更新所需的时间可能会有很大差异,所以这将是我们的主要关心。很难说一个程序执行的速度有多快,因为这取决于很多因素,包括程序员省外的一些因素,比如编译代码的质量和硬件的速度。即使我们忽略了这些并且仅仅考虑算法的执行时间如何依赖于它的数据,详细的分析可能是复杂的。在 `Donald Knuth` 的经典着作“排序和搜索”(`Addison-Wesley`)中提供了一个相对简单的例子, `Knuth` 的名义 `MIX` 机器上的多列表插入排序程序的最坏情况执行时间推导为

Expand Down
Loading