Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0059489

Browse files
authored
🎨
1 parent 79c998b commit 0059489

File tree

1 file changed

+36
-22
lines changed

1 file changed

+36
-22
lines changed

‎ch17/01_Generic_Algorithms.md

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@
33

44
### 通用算法
55

6-
通用算法分为四个主要类别:更改列表中的元素顺序,更改列表内容,查找集合中的极端值以及查找列表中的特定值。它们表示可重用的功能,因为它们可以应用于任何类型的列表(或在某些情况下适用于集合)。生成这些方法的类型导致了一些相当复杂的声明,因此每个部分都在声明之后简要地讨论这些声明。
6+
通用算法分为四个主要类别:更改列表中的元素顺序,更改列表内容,查找集合中的极端值以及查找列表中的特定值。它们表示可重用的功能,因为它们可以应用于任何
7+
类型的列表(或在某些情况下适用于集合)。生成这些方法的类型导致了一些相当复杂的声明,因此每个部分都在声明之后简要地讨论这些声明。
78

89
### 更改列表元素的顺序
910

10-
有七种方法以各种方式对列表进行重新排序。 其中最简单的是 `swap`,它交换两个元素,并且在实现 `RandomAccess``List` 的情况下,执行时间不变。 最复杂的是排序,它将元素传输到数组中,在时间 `O(n log n)` 中对它们应用合并排序,然后将它们返回到 `List`。 所有其余的方法在时间 `O(n)` 中执行。
11+
有七种方法以各种方式对列表进行重新排序。 其中最简单的是 `swap`,它交换两个元素,并且在实现 `RandomAccess``List` 的情况下,执行时间不变。 最
12+
复杂的是排序,它将元素传输到数组中,在时间 `O(n log n)` 中对它们应用合并排序,然后将它们返回到 `List`。 所有其余的方法在时间 `O(n)` 中执行。
1113

1214
```java
1315
void reverse(List<?> list) // 颠倒元素的顺序
@@ -19,50 +21,62 @@ void shuffle(List<?> list, Random rnd) // 用随机性源rnd随机排列列表
1921
void swap(List<?> list, int i, int j) // 交换指定位置的元素
2022
```
2123

22-
对于这些方法中的每一种,除了排序和交换,都有两种算法,一种使用迭代,另一种使用随机访问。 方法 `sort``List` 元素传递给一个数组,在当前实现中它们使用 `n log n` 性能的 `mergesort` 算法进行排序。 方法交换总是使用随机访问。本节中其他方法的标准实现使用迭代或随机访问,具体取决于列表是否实现了 `RandomAccess` 接口(请参阅第 `8.3` 节)。 如果是这样,则实现选择随机访问算法; 即使对于没有实现 `RandomAccess` 的列表,但是,如果列表大小低于给定阈值,则使用随机访问算法,这是通过性能测试在每个方法基础上确定的。
24+
对于这些方法中的每一种,除了排序和交换,都有两种算法,一种使用迭代,另一种使用随机访问。 方法 `sort``List` 元素传递给一个数组,在当前实现中它们
25+
使用 `n log n` 性能的 `mergesort` 算法进行排序。 方法交换总是使用随机访问。本节中其他方法的标准实现使用迭代或随机访问,具体取决于列表是否实现了
26+
`RandomAccess` 接口(请参阅第 `8.3` 节)。 如果是这样,则实现选择随机访问算法; 即使对于没有实现 `RandomAccess` 的列表,但是,如果列表大小低于给定
27+
阈值,则使用随机访问算法,这是通过性能测试在每个方法基础上确定的。
2328

2429
### 更改列表的内容
2530

26-
这些方法改变了列表的一些或全部元素。 该方法拷贝将源列表中的元素转移到目的地列表的初始子列表中(其必须足够长以容纳它们),从而使目的地列表的任何剩余元素保持不变。方法 `fill` 使用指定对象替换列表中的每个元素,并且 `replaceAll` 将列表中每个值的每次出现替换为另一个值,其中旧值或新值可以为空 - 如果进行了替换,则返回 `true`
31+
这些方法改变了列表的一些或全部元素。 该方法拷贝将源列表中的元素转移到目的地列表的初始子列表中(其必须足够长以容纳它们),从而使目的地列表的任何剩余元
32+
素保持不变。方法 `fill` 使用指定对象替换列表中的每个元素,并且 `replaceAll` 将列表中每个值的每次出现替换为另一个值,其中旧值或新值可以为空 - 如果进
33+
行了替换,则返回 `true`
2734

2835
```java
29-
<T> void copy(List<? super T> dest, List<? extends T> src) // 将所有元素从一个列表复制到另一个列表中
30-
<T> void fill(List<? super T> list, T obj) // 用obj替换列表中的每个元素
31-
<T> boolean replaceAll(List<T> list, T oldVal, T newVal) // 用newVal替换列表中出现的所有oldVal
36+
<T> void copy(List<? super T> dest, List<? extends T> src) // 将所有元素从一个列表复制到另一个列表中
37+
<T> void fill(List<? super T> list, T obj) // 用obj替换列表中的每个元素
38+
<T> boolean replaceAll(List<T> list, T oldVal, T newVal) // 用newVal替换列表中出现的所有oldVal
3239
```
3340

34-
这些方法的签名可以使用 `Get``Put` 原则来解释(参见第 `2.4` 节)。`2.3` 节讨论了拷贝的签名。它从源列表中获取元素并将它们放入目标中,因此这些列表的类型分别是 `? extends T``? super T`。 这符合直觉,源列表元素的类型应该是目标列表的子类型。 虽然复制签名有更简单的选择,但 `2.3` 节规定尽可能使用通配符扩大了允许的呼叫范围。
41+
这些方法的签名可以使用 `Get``Put` 原则来解释(参见第 `2.4` 节)。`2.3` 节讨论了拷贝的签名。它从源列表中获取元素并将它们放入目标中,因此这些列表
42+
的类型分别是 `? extends T``? super T`。 这符合直觉,源列表元素的类型应该是目标列表的子类型。 虽然复制签名有更简单的选择,但 `2.3` 节规定尽可能
43+
使用通配符扩大了允许的呼叫范围。
3544

36-
对于填充,`Get``Put` 原则规定,如果要将值放入参数化集合中,应该使用 `super`;对于 `replaceAll`,它指出如果要将值放入并从同一结构中获取值,则不应使用完全通配符。
45+
对于填充,`Get``Put` 原则规定,如果要将值放入参数化集合中,应该使用 `super`;对于 `replaceAll`,它指出如果要将值放入并从同一结构中获取值,则不
46+
应使用完全通配符。
3747

3848
### 在集合中查找极端值
3949

4050
方法 `min``max` 是为此目的提供的,每个方法都有两个重载 - 一个使用元素的自然顺序,一个接受比较器强制排序。 它们以线性时间执行。
4151

4252
```java
43-
<T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) // 使用自然顺序返回最大元素
44-
<T> T max(Collection<? extends T> coll, Comparator<? super T> comp) // 使用提供的比较器返回最大元素
45-
<T extends Object & Comparable<? super T>>
46-
T min(Collection<? extends T> coll) // 使用自然顺序返回最小元素
47-
<T> T min(Collection<? extends T> coll, Comparator<? super T> comp) // 使用提供的比较器返回最小元素
53+
<T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) // 使用自然顺序返回最大元素
54+
<T> T max(Collection<? extends T> coll, Comparator<? super T> comp) // 使用提供的比较器返回最大元素
55+
<T extends Object & Comparable<? super T>>
56+
T min(Collection<? extends T> coll) // 使用自然顺序返回最小元素
57+
<T> T min(Collection<? extends T> coll, Comparator<? super T> comp) // 使用提供的比较器返回最小元素
4858
```
4959

5060
在列表中查找特定值
5161

5262
该组中的方法在 `List` 中找到元素或元素组,再次根据列表的大小以及是否实现 `RandomAccess` 在替代算法之间进行选择。
5363

5464
```java
55-
<T> int binarySearch(List<? extends Comparable<? super T>> list, T key) // 使用二分查找搜索密钥
56-
<T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) // 使用二分查找搜索密钥
57-
int indexOfSubList(List<?> source, List<?> target) // 找到匹配目标的源的第一个子列表
58-
int lastIndexOfSubList(List<?> source, List<?> target) // 找到与目标匹配的源的最后一个子列表
65+
<T> int binarySearch(List<? extends Comparable<? super T>> list, T key) // 使用二分查找搜索密钥
66+
<T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) // 使用二分查找搜索密钥
67+
int indexOfSubList(List<?> source, List<?> target) // 找到匹配目标的源的第一个子列表
68+
int lastIndexOfSubList(List<?> source, List<?> target) // 找到与目标匹配的源的最后一个子列表
5969
```
6070

61-
第一个 `binarySearch` 重载的签名表示可以使用它在对象列表中搜索类型为 `T` 的键,该对象列表中可以具有任何类型,可以与T类型的对象进行比较。第二种类似于比较器 `min``max` 的重载,除了在这种情况下,`Collection` 的类型参数必须是键类型的子类型,而该类型又必须是 `Comparator` 的类型参数的子类型。
71+
第一个 `binarySearch` 重载的签名表示可以使用它在对象列表中搜索类型为 `T` 的键,该对象列表中可以具有任何类型,可以与T类型的对象进行比较。第二种类似
72+
于比较器 `min``max` 的重载,除了在这种情况下,`Collection` 的类型参数必须是键类型的子类型,而该类型又必须是 `Comparator` 的类型参数的子类型。
6273

63-
二进制搜索需要一个排序列表来进行操作。在搜索开始时,搜索值可能出现的索引范围对应于整个列表。二分搜索算法使用采样元素的值来采样该范围中间的元素,以确定新范围是上一个旧范围的一部分还是元素索引下的部分。第三种可能性是采样值等于搜索值,在这种情况下搜索完成。由于每个步骤将范围的大小减半,因此需要m个步骤才能在长度为 `2 m` 的列表中找到搜索值,并且长度为n的列表的时间复杂度为 `O(log n)`
74+
二进制搜索需要一个排序列表来进行操作。在搜索开始时,搜索值可能出现的索引范围对应于整个列表。二分搜索算法使用采样元素的值来采样该范围中间的元素,以确
75+
定新范围是上一个旧范围的一部分还是元素索引下的部分。第三种可能性是采样值等于搜索值,在这种情况下搜索完成。由于每个步骤将范围的大小减半,因此需要m个步
76+
骤才能在长度为 `2 m` 的列表中找到搜索值,并且长度为n的列表的时间复杂度为 `O(log n)`
6477

65-
`indexOfSubList``lastIndexOfSubList` 方法的操作不需要排序列表。他们的签名允许源列表和目标列表包含任何类型的元素(请记住,这两个通配符可能代表两种不同的类型)。这些签名背后的设计决策与 `Collection` 方法 `containsAll`,`retainAll`和removeAll背后的设计决策相同(参见第 `2.6` 节)。
78+
`indexOfSubList``lastIndexOfSubList` 方法的操作不需要排序列表。他们的签名允许源列表和目标列表包含任何类型的元素(请记住,这两个通配符可能代表
79+
两种不同的类型)。这些签名背后的设计决策与 `Collection` 方法 `containsAll`,`retainAll`和removeAll背后的设计决策相同(参见第 `2.6` 节)。
6680

6781
《《《 [下一节](02_Collection_Factories.md) <br/>
68-
《《《 [返回首页](../README.md)
82+
《《《 [返回首页](../README.md)

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /