java - 什么对计数、数组或哈希图(或集合)更有效
问题描述
假设我们被要求计算和打印给定字符串中每个字符的出现次数。为简单起见,字符串只有小写字母。我编写了这两个函数,我想知道哪一个在 Java 中更高效/更可取。
功能一:
private void countAndPrintArray1(String str){
int[] a = new int[26];
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int index = c - 'a';
a[index] = a[index] + 1;
}
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int freq = a[c -'a'];
System.out.println(c+" -> "+ freq);
}
}
功能二:
private void countAndPrintArray2(String str){
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int freq = map.getOrDefault(c, 0) + 1;
map.put(c, freq);
}
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
int freq = map.get(c);
System.out.println(c+" -> "+ freq);
}
}
解决方案
根据性能比较这两种方法,两种算法都以 O(n) 时间复杂度运行,其中 n 是所提供字符串的大小。此外,两种情况下的空间复杂度都是 O(1)。谈到偏好,这取决于开发人员和开发产品的团队。虽然 HashMap 方法似乎更加精巧和干净(再次开发人员意见)。
推荐阅读
- javascript - 使用 JavaScript 突出显示当前页面
- swift - 为什么 Swift 在 for-in 循环中使用下标语法比使用直接访问元素更快?
- c++ - 如何更改 c++ 文件的 mach-o 可执行文件的入口点?
- codenameone - 在有/没有互联网的情况下为 OfflineCommand 按顺序或随机顺序生成数字
- dart - 输入'列表
' 不是类型转换中类型 'String' 的子类型 - javascript - 页面重新加载后向导航添加和删除类
- excel - 仅适用于可见单元的 If 语句
- c# - 如何访问 .jar 文件的内容
- python - 带有 tensorflow 的 tpu_estimator() 的生成模型?
- opendaylight - 由于父合并而创建的子树的修改类型是什么