function countAndSortWords(str) {
const wordCount = {};
const words = str.split(' ');
for (const word of words) {
if (wordCount[word]) {
wordCount[word]++;
} else {
wordCount[word] = 1;
}
}
const wordArray = Object.entries(wordCount).map(([word, count]) => ({ word, count }));
wordArray.sort((a, b) => {
if (a.count!== b.count) {
return b.count - a.count;
} else {
return a.word.localeCompare(b.word);
}
});
return wordArray.map(({ word, count }) => ({ word, count }));
}
性能优化策略
- 使用对象存储单词计数:利用JavaScript对象的快速查找特性,通过哈希表的方式存储每个单词及其出现次数,这样在统计单词出现次数时,每次查找操作的时间复杂度为O(1),而不是使用数组进行线性查找(时间复杂度为O(n))。
- 减少中间数据存储:在统计完单词次数后,直接将对象转换为数组进行排序,避免创建过多不必要的中间数据结构,减少内存消耗。
- 高效的排序算法:JavaScript的
Array.prototype.sort
方法内部实现通常是一种优化过的排序算法(例如V8引擎使用的是TimSort),它在处理大规模数据时具有较好的性能。通过自定义比较函数,先按出现次数从高到低排序,次数相同再按字典序排序,保证排序的正确性和高效性。
- 分批处理:如果字符串过大导致一次性处理内存不足,可以考虑将字符串按一定规则(如固定长度)分割成多个小部分,分别进行单词统计,最后再合并统计结果并排序。