通过小项目重新审视 DSA #1:使用 HashMap 优化电话簿

发布: (2026年2月2日 GMT+8 18:24)
3 min read
原文: Dev.to

Source: Dev.to

Introduction

我正在通过为每个主题创建一个小项目来重新学习数据结构与算法(DSA)。这种方法帮助我看到 DSA 概念在实际应用中的运用,并且还能提供可展示的作品。

本系列的第一个项目是 电话簿应用——你可以在这里尝试: https://hashphonebook.netlify.app/

当我第一次构建该应用时,我把联系人存放在一个简单的 JavaScript 数组中,并使用线性搜索:

// Sample data
let userArray = [
    { userName: "Jane", number: "1237893457" },
    { userName: "Oscar", number: "4562317895" }
];

// Linear search (O(n))
const result = userArray.find(contact => contact.userName === "Oscar");

对于只有少量条目的演示来说,这样完全可行,但其时间复杂度是 O(n)。如果电话簿增长到比如 100 000 条联系人,最坏情况下的查找将在真实场景中变得代价高昂。

Why Performance Matters

在紧急情况下,等待一次需要扫描成千上万条记录的搜索是不可接受的。我们需要一种能够提供更快查找的数据结构。

Optimized Implementation (HashMap / Object)

哈希表(或普通的 JavaScript 对象)提供 O(1) 的平均查找时间。通过使用联系人的姓名作为键,我们可以瞬间获取电话号码,无论条目总数多少。

// HashMap representation
let contactMap = {
    "Jane": "1237893457",
    "Oscar": "4562317895"
};

// Constant‑time lookup (O(1))
const number = contactMap["Jane"];

无论我们拥有 5 条联系人还是 50 亿条,查找速度始终保持不变。

Code Changes

Adding a Contact

Before (Array.push):

userArray.push({ userName, contactNumber });

After (Map key‑value):

// Store as a key‑value pair; make the search case‑insensitive
contactMap[userName.toLowerCase()] = {
    originalName: userName,
    number: contactNumber
};

Searching

Before (Array.find):

const result = userArray.find(contact => contact.userName === searchName);

After (Object lookup):

const entry = contactMap[searchName.toLowerCase()];

Takeaway

一段“可运行的代码”并不一定是“好代码”。线性搜索对小型演示足够,但它无法扩展。切换到哈希表使电话簿变得高效,并且能够应对真实世界的使用需求。

这只是我 DSA 复习之旅的第一步,我将继续构建小项目,以巩固每个概念。

Back to Blog

相关文章

阅读更多 »

你好 DEV 社区 👋

嗨 👋 我是一名全栈开发者学生。目前正在学习 Angular、Spring Boot 和 GitHub 最佳实践。我在这里学习,分享我的旅程,并与他人联系。