面试时看到一个试题, 编写算法, 快速找出两个字符串中所有相同的字符. 现实现如下:
1. 利用TreeSet来查找是否有相同的字符(之前是利用TreeSet来查找)
2. 利用HashSet来查找是否有相同的字符(改进后利用HashSet来查找)
经测试,HashSet几乎在所有情况下都比TreeSet耗时更少。HashSet的底层实现决定了其能比TreeSet更快速的处理该问题。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collection;
import java.util.HashSet;
import java.util.TreeSet;
public class CharFilter {
// 利用TreeSet进行 查找
public static void filterByTreeSet(String str1, String str2, Collection<Character> result) {
// 利用Java的TreeSet进行排序
TreeSet<Character> tree1 = new TreeSet<Character>();
for (char ch : str1.toCharArray()) {
tree1.add(ch);
}
// 结果集
for (char ch : str2.toCharArray()) {
// 查找相同的字符
boolean contain = tree1.contains(ch);
if (contain) {
// 加入结果集
result.add(ch);
}
}
}
// 利用HashSet进行 查找
public static void filterByHashSet(String str1, String str2, Collection<Character> result) {
// 利用Java的TreeSet进行排序
HashSet<Character> tree1 = new HashSet<Character>();
for (char ch : str1.toCharArray()) {
tree1.add(ch);
}
// 结果集
for (char ch : str2.toCharArray()) {
// 查找相同的字符
boolean contain = tree1.contains(ch);
if (contain) {
// 加入结果集
result.add(ch);
}
}
}
public static void main(String[] args) throws IOException {
// 输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
// 输入第一个字符串
System.out.println("Please input string 1");
String str1 = reader.readLine();
// 输入第二个字符串
System.out.println("Please input string 2");
String str2 = reader.readLine();
// 利用Java的TreeSet进行排序
TreeSet<Character> result = new TreeSet<Character>();
long start, end;
long treeGap, hashGap;
start = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
filterByTreeSet(str1, str2, result);
}
end = System.currentTimeMillis();
treeGap = end - start;
// 输出相同的字符
System.out.println("耗时: " + treeGap);
System.out.println("相同的字符数: " + result.size());
for (char ch : result) {
System.out.print(ch + " ");
}
result.clear();
start = System.currentTimeMillis();
for (int i = 0; i < 500000; i++) {
filterByHashSet(str1, str2, result);
}
end = System.currentTimeMillis();
hashGap = end - start;
// 输出相同的字符
System.out.println();
System.out.println("耗时: " + hashGap);
System.out.println("相同的字符数: " + result.size());
for (char ch : result) {
System.out.print(ch + " ");
}
}
}测试输出:
Please input string 1面试时看到一个试题, 编写算法, 快速找出两个字符串中所有相同的字符. 现实现如下:Please input string 2经测试,HashSet几乎在所有情况下都比TreeSet耗时更少。HashSet的底层实现决定了其能比TreeSet更快速的处理该问题。耗时: 1576相同的字符数: 11下 实 快 所 时 有 现 的 试 速 题 耗时: 949相同的字符数: 11下 实 快 所 时 有 现 的 试 速 题
本文通过编程实验对比了HashSet与TreeSet在查找两字符串相同字符任务中的性能表现。结果显示,在大多数情况下,HashSet的处理速度优于TreeSet。
629

被折叠的 条评论
为什么被折叠?



