当前位置: 首页 > news >正文

统计文本文件中单词频率的 Swift 与 Bash 实现详解

在这里插入图片描述
在这里插入图片描述

网罗开发 (小红书、快手、视频号同名)

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:极星会首批签约作者

文章目录

    • 摘要
    • 描述
    • 题解答案
      • Bash 实现
      • Swift 实现
    • 题解代码分析
      • Bash 解法
      • Swift 解法
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结
    • 未来展望
    • 参考资料

摘要

本文将探讨如何统计文本文件中每个单词的出现频率,具体实现包括 Bash 脚本的经典解法和 Swift 的高效实现。我们不仅会提供完整的代码,还将逐步拆解逻辑,帮助读者理解实现细节。同时,文章会分析时间与空间复杂度,并附上运行示例及结果。

描述

写一个 bash 脚本以统计一个文本文件 words.txt 中每个单词出现的频率。

为了简单起见,你可以假设:

  • words.txt只包括小写字母和 ' '
  • 每个单词只由小写字母组成。
  • 单词间由一个或多个空格字符分隔。

示例:

假设 words.txt 内容如下:

the day is sunny the the
the sunny is is

你的脚本应当输出(以词频降序排列):

the 4
is 3
sunny 2
day 1

说明:

  • 不要担心词频相同的单词的排序问题,每个单词出现的频率都是唯一的。
  • 你可以使用一行 Unix pipes 实现吗?

题解答案

Bash 实现

我们可以使用一行 Unix 管道命令来高效完成统计任务:

cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | awk '{print $2, $1}'

Swift 实现

我们用 Swift 提供更具可读性和扩展性的解法:

import Foundationfunc countWordFrequencies(filePath: String) {do {let content = try String(contentsOfFile: filePath)let words = content.split { $0.isWhitespace }.map { String($0) }var wordCount: [String: Int] = [:]for word in words {wordCount[word, default: 0] += 1}let sortedWordCount = wordCount.sorted { $0.value > $1.value }for (word, count) in sortedWordCount {print("\(word) \(count)")}} catch {print("Error reading file: \(error.localizedDescription)")}
}// 示例调用
let filePath = "path/to/words.txt"
countWordFrequencies(filePath: filePath)

题解代码分析

Bash 解法

cat words.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | awk '{print $2, $1}'
  1. cat words.txt: 读取文件内容。
  2. tr -s ' ' '\n': 将所有空格替换为换行符,从而每行一个单词。
  3. sort: 对单词排序,方便后续统计。
  4. uniq -c: 统计每个单词的出现次数,并输出格式为 次数 单词
  5. sort -rn: 按次数降序排列。
  6. awk '{print $2, $1}': 调整输出顺序为 单词 次数

Swift 解法

  1. 读取文件: 使用 String(contentsOfFile:) 读取文本内容。
  2. 分割单词: 用 split 按空格切分字符串,并将结果转换为字符串数组。
  3. 统计频率: 利用字典存储每个单词的计数,wordCount[word, default: 0] += 1 实现自动初始化与计数。
  4. 排序: 使用 sorted 按频率降序排列。
  5. 输出结果: 遍历排序后的数组并打印结果。

示例测试及结果

输入文件 words.txt:

the day is sunny the the
the sunny is is

Bash 输出:

the 4
is 3
sunny 2
day 1

Swift 输出:

the 4
is 3
sunny 2
day 1

时间复杂度

  1. Bash 实现:

    • sort: O(n log n),其中 n 是单词总数。
    • uniq -c: O(n)
    • sort -rn: O(n log n)
    • 总复杂度:O(n log n)
  2. Swift 实现:

    • 读取与分割: O(n)
    • 统计频率: O(n)
    • 排序: O(k log k),其中 k 是唯一单词的个数。
    • 总复杂度:O(n + k log k)

空间复杂度

  1. Bash 实现: 依赖 Unix 管道,无需额外存储空间,复杂度为 O(1)
  2. Swift 实现: 使用数组和字典存储单词和频率,复杂度为 O(n)

总结

  1. Bash 解法: 简洁高效,适用于快速处理任务。
  2. Swift 解法: 代码结构清晰,适合需要更多功能扩展的场景。

未来展望

  1. 扩展到大规模分布式文本处理,可引入 Hadoop 或 Spark。
  2. 添加多语言支持,处理更复杂的文本格式(如标点符号、大小写敏感性)。

参考资料

  • Bash 文档
  • Swift 官方文档
  • Linux tr 手册

相关文章:

统计文本文件中单词频率的 Swift 与 Bash 实现详解

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

iOS 权限管理:同时请求相机和麦克风权限的最佳实践

引言 在开发视频类应用时,我们常常会遇到需要同时请求相机和麦克风权限的场景。比如,在用户发布视频动态时,相机用于捕捉画面,麦克风用于录制声音;又或者在直播功能中,只有获得这两项权限,用户…...

Excel 实现文本拼接方法

1. 使用 & 运算符 这是最常见和简单的拼接方法。你只需使用 & 来连接多个文本单元格或文本字符串。 示例公式: A1 & B1这个公式会将 A1 和 B1 单元格中的文本合并为一个字符串。 如果你希望在文本之间加入分隔符(如空格、逗号等&#xf…...

软考信安27~Windows操作系统安全相关

1、Windows账户与组管理 1.1、用户账户查看 whoami #查看当前登录的用户名称 whoami /all #查看当前系统的用户名和组信息,以及SID whoami /user #查看当前用户的SID net user #查看系统中包含哪些用户 wmic useraccount get name,sid #查看…...

从 Spark 到 StarRocks:实现58同城湖仓一体架构的高效转型

作者:王世发,吴艳兴等,58同城数据架构部 导读: 本文介绍了58同城在其数据探查平台中引入StarRocks的实践,旨在提升实时查询性能。在面对传统Spark和Hive架构的性能瓶颈时,58同城选择StarRocks作为加速引擎&…...

WordPress Hunk Companion插件节点逻辑缺陷导致Rce漏洞复现(CVE-2024-9707)(附脚本)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

使用 HTML 开发 Portal 页全解析

前言 在当今数字化时代,网站作为企业和个人展示信息、提供服务的重要窗口,其重要性不言而喻。而 Portal 页,作为网站的核心页面之一,承担着引导用户、整合信息等关键任务。那么,如何使用 HTML 开发一个功能齐全、界面…...

机器学习(二)

一,Multiple features(多类特征) 多元线性回归: 1,多类特征的符号表示: (可以类比二维数组) 2,多元线性回归模型: 二,Vectorization(向量化) (简化代码&缩短运行速度): 向量化实现多元线性回归模型: 向量化实现多…...

Laravel 实战:用Carbon筛选最近15分钟内的数据

在开发基于时间的特性时,常常需要筛选出在特定时间范围内的记录。例如,在一个设备报告系统中,你可能需要获取最近15分钟内的设备报告。本文将介绍如何在 Laravel 中实现这一功能,包括如何使用 Carbon 和 Eloquent 查询来筛选 crea…...

Ubuntu20.04 文件系统打不开

问题描述: 电脑中安装了相关的工具, 删除了一些东西之后,Linux 电脑操作系统为 Ubuntu20.04突然打不开文件系统了,命令 sudo nautilus 可以正常进入, 显示了很多权限问题。 使用过: killall nautilus 不起作用,后查原因:我无法作为普通用户…...

vue3的组件v-model(defineModel()宏)

这里展示的是vue3.4版本之前的如何在组件上使用以实现双向绑定 <template><p>我是子组件</p><input :value"props.modelValue" input"handelInput"/> </template><script lang"ts" setup>const props def…...

在 Ubuntu 22.04 上安装 Kubernetes(Kubeadm 安装方式)

使用 Kubeadm、Containerd 和 Calico 网络插件搭建 Kubernetes 集群教程 1.安装前准备&#xff08;所有节点执行&#xff09; 关闭防火墙 sudo systemctl disable --now ufw设置服务时区 # 设置为亚洲的上海时区 sudo timedatectl set-timezone Asia/Shanghai # 重启时间同…...

2_高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计

一、高并发内存池框架设计 高并发池框架设计&#xff0c;特别是针对内存池的设计&#xff0c;需要充分考虑多线程环境下&#xff1a; 性能问题锁竞争问题内存碎片问题 高并发内存池的整体框架设计旨在提高内存的申请和释放效率&#xff0c;减少锁竞争和内存碎片。 高并发内存…...

Java算法——排序

目录 引言1. 插入排序1.1 基本思想1.2 直接插入排序1.3 希尔排序 2. 选择排序2.1 基本思想2.2 直接选择排序2.3 直接选择排序变种2.4 堆排序 3. 交换排序3.1 基本思想3.2 冒泡排序3.3 快速排序3.3.1 快速排序的基本结构3.3.2 Hoare法3.3.3 挖坑法3.3.4 双指针法 3.4 快速排序非…...

【Python・机器学习】多元回归模型(原理及代码)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文最少限度涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&am…...

mysql数据被误删的恢复方案

文章目录 一、使用备份恢复二、使用二进制日志&#xff08;Binary Log&#xff09;三、使用InnoDB表空间恢复四、使用第三方工具预防措施 数据误删是一个严重的数据库管理问题&#xff0c;但通过合理的备份策略和使用适当的恢复工具&#xff0c;可以有效地减少数据丢失的风险…...

使用EasyExcel(FastExcel) 的模板填充报Create workbook failure

场景 使用 EasyExcel (FastExcel) 做数据导出时&#xff0c;用了通过模板导出数据的形式。 在读取模板文件的时候出现错误导致创建Workbook 失败&#xff0c; 错误日志&#xff1a; Create workbook failure... No valid entries or contents found, this is not a valid OOX…...

[C]基础8.详解操作符

博客主页&#xff1a;算法歌者本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、操作符的分类2、二进制和进制转换2.1、2进制转10进制2.2、10进制转2进制2.3、2进制转8进制和16进制 3、原码、反码、补码4、移位操作符4.1 左移操作符4.2 右移操…...

MySQL篇之对MySQL进行参数优化,提高MySQL性能

1. MySQL参数优化说明 MySQL 参数调优是提高数据库性能的重要手段之一。通过调整 MySQL 的配置参数&#xff0c;可以优化查询速度、提升并发处理能力、减少资源消耗等。 MySQL 的性能优化涉及到多个方面&#xff0c;包括内存管理、磁盘 I/O、查询优化、连接管理、复制配置等。…...

Vue 3 的 keep-alive 及生命周期钩子

在 Vue 3 中&#xff0c;keep-alive 是一个内置组件&#xff0c;用于提高性能和减少不必要的组件销毁与重建。它与组件的生命周期紧密相关&#xff0c;特别是在动态组件和路由切换场景下&#xff0c;能够缓存组件的状态并避免重新渲染。 而 onActivated 和 onDeactivated 是 …...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...