Java 中高效查找子数组:深入剖析45


在 Java 中高效地查找子数组对于解决各种问题至关重要,例如字符串匹配、统计分析和数据挖掘。本文深入剖析了 Java 中用于查找子数组的各种技术,阐明它们的优缺点,并提供代码示例以进行实际演示。

暴力破解法

最直接的方法是暴力破解法,它逐个检查数组中的所有元素并与子数组进行比较。尽管效率较低,但有时它是小型数组或子数组长度较短的理想选择。请考虑以下代码示例:```java
public static int findSubarray(int[] arr, int[] sub) {
for (int i = 0; i < ; i++) {
for (int j = 0; j < ; j++) {
if (arr[i + j] != sub[j]) {
break;
} else if (j == - 1) {
return i;
}
}
}
return -1;
}
```

KMP 算法

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,它可以应用于子数组查找。该算法利用预处理来计算子数组元素之间的偏移量,从而显著提高搜索效率。以下是 KMP 算法的 Java 实现示例:```java
public static int findSubarrayKMP(int[] arr, int[] sub) {
int[] lps = computeLPSArray(sub);
int i = 0;
int j = 0;
while (i < ) {
if (arr[i] == sub[j]) {
i++;
j++;
if (j == ) {
return i - j;
}
} else if (j > 0) {
j = lps[j - 1];
} else {
i++;
}
}
return -1;
}
```

Rabin-Karp 算法

Rabin-Karp 算法是另一种基于哈希值的快速子数组查找算法。它通过计算子数组和数组中滑动窗口的哈希值来进行比较。如果哈希值匹配,则进一步检查实际元素以确认匹配。请参阅以下 Java 实现:```java
public static int findSubarrayRabinKarp(int[] arr, int[] sub) {
int subHash = hash(sub);
int windowHash = hash(sub, arr, 0, - 1);
if (subHash == windowHash) {
return 0;
}
int i = 1;
while (i

2024-11-16


上一篇:Java 字符串转换为数字

下一篇:Java List 方法的全面指南