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

news2025/1/25 0:39:19

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

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

  大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括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 Foundation

func 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 手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2281691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络 (57)改进“尽最大努力交付”的服务

前言 计算机网络中的“尽最大努力交付”服务是网络层的一种数据传输方式。这种服务的特点是网络层只负责尽力将数据报从源端传输到目的端,而不保证数据传输的可靠性。 一、标记与分类 为数据分组打上标记: 给不同性质的分组打上不同的标记&#x…

联想电脑怎么设置u盘启动_联想电脑设置u盘启动方法(支持新旧机型)

有很多网友问联想电脑怎么设置u盘启动,联想电脑设置u盘启动的方法有两种,一是通过bios进行设置。二是通过快捷方式启动进入u盘启动。但需要注意有两种引导模式是,一种是uefi引导,一种是传统的leacy引导,所以需要注意制…

Springboot3 自动装配流程与核心文件:imports文件

注:本文以spring-boot v3.4.1源码为基础,梳理spring-boot应用启动流程、分析自动装配的原理 如果对spring-boot2自动装配有兴趣,可以看看我另一篇文章: Springboot2 自动装配之spring-autoconfigure-metadata.properties和spring…

SET alter system reload

目录标题 alter system 只是 写 auto 文件SET & alter system1. **会话级别参数(Session-level parameters)**2. **系统级别参数(System-level parameters)**3. **某些特定的超级用户参数**4. **修改时生效的参数**总结&#…

RPC是什么?和HTTP区别?

RPC 是什么?HTTP 是什么? 作为一个程序员,假设我们需要从A电脑的进程发送一段数据到B电脑的进程,我们一般会在代码中使用 Socket 进行编程。 此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不…

Y1打卡学习笔记

🍨 本文为🔗365天深度学习训练营 中的学习记录博客>- **🍖原作者:K同学啊** yolov5学习 下载源码运行命令查看结果视频检测个人总结 下载源码 地址:https://github.com/ultralytics/yolov5打开cmd后输入&#xff1…

【前端】Hexo 建站指南

文章目录 前言生成站点本地测试部署云端参考 前言 更好的阅读体验:https://blog.dwj601.cn/FrontEnd/Hexo/build-your-own-website-with-hexo/ 笔记记多了,想要分享给同学们一起交流进步,该怎么办?想要搭建一个属于自己的知识库…

【后端开发】字节跳动青训营之Go语言进阶与依赖管理

Go语言进阶与依赖管理 一、Go语言进阶1.1 并发与并行1.2 协程与线程1.3 通道1.3.1 生产消费模型 1.4 并发安全 二、依赖管理 一、Go语言进阶 Go语言一次可以创建上万个协程。 1.1 并发与并行 并发:多程序程序在单核CPU上运行。并行:多程序程序在多核CP…

大模型-本地化部署调用--基于ollama+openWebUI+springBoot

大模型-本地化部署调用–基于ollamaopenWebUIspringBoot 前言 前段时间,啊,可能不是前段时间,过去的2024年吧,大模型这块的内容也是非常火的,各家巨头也开始卷大模型的研发。那么本人呢也在过去的一年中也是用到了一…

RKNN_C++版本-YOLOV5

1.背景 为了实现低延时,所以开始看看C版本的rknn的使用,确实有不足的地方,请指正(代码借鉴了rk官方的仓库文件)。 2.基本的操作流程 1.读取模型初始化 // 设置基本信息 // 在postprocess.h文件中定义,详见…

H3C-防火墙IPSec配置案例(主模式)

目录 1.IPSec简述:2.IPSec应用场景:3.网络拓扑及说明:4.案例背景:5.网络配置:5.1 基础网络配置:5.1.1 总部防火墙基础配置:5.1.2 分部防火墙基础配置:5.1.3 互联网路由器基础配置:5.1.4 总部服务器基础配置:5.1.5 总部PC基础配置: 5.2 IPSec配置:5.2.1 总部防火墙IPSec配置:5.2…

windows下本地部署安装hadoop+scala+spark-【不需要虚拟机】

注意版本依赖【本实验版本如下】 Hadoop 3.1.1 spark 2.3.2 scala 2.11 1.依赖环境 1.1 java 安装java并配置环境变量【如果未安装搜索其他教程】 环境验证如下: C:\Users\wangning>java -version java version "1.8.0_261" Java(TM) SE Runti…

vim如何显示行号

:set nu 显示行号 :set nonu 不显示行号 (vim如何使设置显示行号永久生效:vim如何使相关设置永久生效-CSDN博客)

国产编辑器EverEdit - 命令窗口应用详解

1 命令窗口应用详解 1.1 应用场景 有时需要在EverEdit中执行一些命令行工具,甚至想把当前文档做为参数,传递给命令进行一些文本分析,比如:一些常用的文本处理工具,gawk.exe等。 1.2 使用方法 命令窗口的使用在官方手…

Linux C\C++编程-文件位置指针与读写文件数据块

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…

vue2使用flv.js在浏览器打开flv格式视频

组件地址&#xff1a;GitHub - bilibili/flv.js: HTML5 FLV Player flv.js 仅支持 H.264 和 AAC/MP3 编码的 FLV 文件。如果视频文件使用了其他编码格式就打不开。 flv.vue <template><div><el-dialog :visible.sync"innerVisibleFlv" :close-on-pre…

Linux下Ubuntun系统报错find_package(BLAS REQUIRED)找不到

Linux下Ubuntun系统报错find_package(BLAS REQUIRED)找不到 这次在windows的WSL2中遇到了一个非常奇怪的错误&#xff0c;就是 CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find BLAS (missing: BLAS_LIBRAR…

仿 RabbitMQ 的消息队列3(实战项目)

七. 消息存储设计 上一篇博客已经将消息统计文件的读写代码实现了&#xff0c;下一步我们将实现创建队列文件和目录。 实现创建队列文件和目录 初始化 0\t0 这样的初始值. //创建队列对应的文件和目录&#xff1a;public void createQueueFile(String queueName) throws IO…

多线程杂谈:惊群现象、CAS、安全的单例

引言 本文是一篇杂谈&#xff0c;帮助大家了解多线程可能会出现的面试题。 目录 引言 惊群现象 结合条件变量 CAS原子操作&#xff08;cmp & swap&#xff09; 线程控制&#xff1a;两个线程交替打印奇偶数 智能指针线程安全 单例模式线程安全 最简单的单例&…

腾讯 Hunyuan3D-2: 高分辨率3D 资产生成

腾讯 Hunyuan3D-2&#xff1a;高分辨率 3D 资产生成的突破 前言 在当今数字化时代&#xff0c;3D 资产生成技术正变得越来越重要。无论是游戏开发、影视制作还是虚拟现实领域&#xff0c;高质量的 3D 模型和纹理都是创造沉浸式体验的关键。然而&#xff0c;传统的 3D 资产制作…