Lời nói đầu – Hướng dẫn về Cấu trúc Dữ liệu và Thuật toán – Việt-Trung

Lời nói đầu前 言
Cấu trúc dữ liệu và thuật toán không chỉ là những khái niệm trừu tượng.数据结构与算法并不只是抽象的概念,掌握好的话可以写出更高效、运行得更快的代码,这对于如今盛行的网页和移动应用开发来说尤为重要。
Nắm vững chúng cho phép bạn viết mã hiệu quả hơn chạy nhanh hơn, điều này đặc biệt quan trọng đối với các ứng dụng web và thiết bị di động ngày nay.如果你最近一次使用算法是在大学课堂上或求职面试时,那你应该还没见识到它的真正威力。
Nếu lần cuối bạn nhìn thấy một thuật toán trong một khóa học đại học hoặc tại một cuộc phỏng vấn việc làm, bạn đang bỏ lỡ những thuật toán sức mạnh thô có thể cung cấp.这个主题的大多数资料都有一种通病——晦涩难懂。
Vấn đề với hầu hết các tài nguyên về các chủ đề này là chúng ... cũng ... rất khó hiểu.满纸的数学术语,搞得除非你是数学家, 不然真不知道作者在说什么。
Hầu hết các văn bản đều tập trung vào các biệt ngữ toán học và nếu bạn không phải là một nhà toán học, sẽ thực sự khó khăn để hiểu những gì trên Trái đất đang diễn ra.即使是一些声称“简化”过的书,看起来也好像已经认定读者都掌握了高深的数学知识。
Ngay cả những cuốn sách tuyên bố tạo ra các thuật toán “dễ dàng” cũng cho rằng người đọc có trình độ toán cao cấp.这就导致了很多人对此主题望而生畏,以为自己的智商不足以理解这些概念。
Do đó, quá nhiều người né tránh những khái niệm này, cảm thấy rằng họ chỉ đơn giản là không đủ “thông minh” để hiểu chúng.但事实上,数据结构与算法都是能够从常识推导出来的。
Tuy nhiên, sự thật là mọi thứ về cấu trúc dữ liệu và thuật toán đều trở nên thông thường.数学符号只是一种特定的语言,数学里的一切都是可以用常识去解释的。
Bản thân ký hiệu toán học chỉ đơn giản là một ngôn ngữ cụ thể, và mọi thứ trong toán học cũng có thể được giải thích bằng thuật ngữ thông thường.本书用到的数学知识就只有加减乘除和指数,所有的概念都可以用文字来解释。
Trong cuốn sách này, tôi không sử dụng bất kỳ phép toán nào ngoài phép cộng, trừ, nhân, chia và số mũ.我还会采用大量的图表以便读者轻松地理解。
Thay vào đó, mọi khái niệm được chia nhỏ bằng tiếng Anh đơn giản, và tôi sử dụng một lượng lớn hình ảnh để khiến mọi thứ trở nên thú vị khi hiểu.一旦掌握了这些知识,你就能写出高效、快速、优雅的代码。
Một khi bạn hiểu những khái niệm này, bạn sẽ được trang bị để viết mã hiệu quả, nhanh chóng và thanh lịch.你还能权衡各种写法的优劣, 并能合理判断适用于给定情况的最优方案。
Bạn sẽ có thể cân nhắc những ưu và nhược điểm của các lựa chọn thay thế mã khác nhau và có thể đưa ra các quyết định có học thức về mã nào là tốt nhất cho tình huống nhất định.一些读者可能是因为学校开设了这门课或者为准备技术面试而阅读本书的。
Một số bạn có thể đang đọc cuốn sách này vì bạn đang học các chủ đề này ở trường hoặc bạn có thể đang chuẩn bị cho các cuộc phỏng vấn kỹ thuật.本书对计算机科学基础的解释能有效地帮助你达到目的。
Trong khi cuốn sách này sẽ làm sáng tỏ những nguyên tắc cơ bản về khoa học máy tính và giúp bạn đạt được những mục tiêu này, tôi khuyến khích bạn đánh giá cao sức mạnh mà những khái niệm này cung cấp trong việc lập trình hàng ngày của bạn.此外,我还鼓励你正视这些概念在日常编程中的实用价值。
Tôi đặc biệt cố gắng biến những khái niệm này thành hiện thực và thực tế với những ý tưởng mà bạn có thể sử dụng ngày nay.为此,我将书中阐述的概念与实际结合,其中的用例都可供大家使用。
Cuốn sách này dành cho ai?目标读者
Cuốn sách này lý tưởng cho nhiều đối tượng:本书适合以下读者。
Bạn là một nhà phát triển mới bắt đầu biết lập trình cơ bản, nhưng muốn học các kiến ​​thức cơ bản về khoa học máy tính để viết mã tốt hơn và nâng cao kiến ​​thức và kỹ năng lập trình của mình.有编程基础的初级开发者,想学习一些计算机科学的基本概念,以优化代码,提高编程技能。
Bạn là một nhà phát triển tự học chưa bao giờ học về khoa học máy tính chính thức (hoặc một nhà phát triển đã học nhưng quên mọi thứ!) Và muốn tận dụng sức mạnh của cấu trúc dữ liệu và thuật toán để viết mã có thể mở rộng và thanh lịch hơn.自学编程的开发者,没学过正规的计算机科学课程(或者学过但忘光了),现在想利用数据结构与算法使代码更灵活、更具扩展性。
Bạn là sinh viên khoa học máy tính muốn có một văn bản giải thích cấu trúc dữ liệu và thuật toán bằng tiếng Anh đơn giản.计算机科学专业的学生,希望找到用简洁语言阐述数据结构与算法的资料。
Cuốn sách này có thể là một bổ sung tuyệt vời cho bất kỳ cuốn sách giáo khoa “cổ điển” nào mà bạn đang sử dụng.这本书很适合作为“经典”教材的补充参考。
Bạn là một nhà phát triển, người cần tìm hiểu những khái niệm này vì bạn có thể chưa sử dụng chúng nhiều trong sự nghiệp của mình nhưng mong đợi sẽ được giải đáp về chúng trong cuộc phỏng vấn kỹ thuật tiếp theo.开发人员,平时也许没怎么利用过数据结构与算法的知识,希望复习这些概念为下次技术面试做准备。
Để giữ cho cuốn sách phần nào không có ngôn ngữ, các ví dụ của chúng tôi lấy từ một số ngôn ngữ lập trình, bao gồm Ruby, Python và JavaScript, vì vậy việc hiểu cơ bản về các ngôn ngữ này sẽ rất hữu ích.为了使本书不特定于某种语言,我们的示例代码会用到多种语言,包括 Ruby、Python 和JavaScript,了解这些语言的话可能会学得更快。
Nói như vậy, tôi đã cố gắng viết các ví dụ theo cách mà ngay cả khi bạn quen thuộc với một ngôn ngữ khác, bạn vẫn có thể làm theo.不过,这些示例代码都没有严格按照惯用语法来写,
Vì vậy, không phải lúc nào tôi cũng học theo các thành ngữ phổ biến cho từng ngôn ngữ mà tôi cảm thấy rằng một thành ngữ có thể gây nhầm lẫn cho người mới sử dụng ngôn ngữ cụ thể đó.避免读者因看不懂某种语言的特有语法而困惑。所以即使不太熟悉某种语言,也还是能跟得上的。
Có gì trong cuốn sách này?本书内容
Như bạn có thể đoán, cuốn sách này nói khá nhiều về cấu trúc dữ liệu và thuật toán.本书的主旨就是数据结构与算法。
Nhưng cụ thể hơn, cuốn sách được bố cục như sau:具体内容如下。
Trong Chương 1 và 2: Tại sao cấu trúc dữ liệu lại quan trọng và tại sao thuật toán lại quan trọng, chúng tôi giải thích cấu trúc dữ liệu và thuật toán là gì, đồng thời khám phá khái niệm về độ phức tạp thời gian — được sử dụng để xác định mức độ hiệu quả của một thuật toán.第 1 章和第 2 章,解释数据结构和算法是什么,并探索时间复杂度这一判断算法效率的概念。
Trong quá trình này, chúng ta cũng nói nhiều về mảng, tập hợp và tìm kiếm nhị phân.此过程中还会经常提及数组、集合和二分查找。
Trong chương 3: Ồ Vâng! Ký hiệu Big O, chúng tôi tiết lộ Ký hiệu Big O và giải thích nó theo cách mà bà tôi có thể hiểu.第 3 章,以老奶奶都听得懂的方式去揭示大 O 记法的本质。
Chúng tôi sẽ sử dụng ký hiệu này trong suốt cuốn sách, vì vậy chương này khá quan trọng.因为大 O 记法全书都会用到, 所以对这一章的理解非常重要。
Trong Chương 4, 5 và 6: Tăng tốc mã của bạn với Big O, Tối ưu hóa mã có và không có Big O và Tối ưu hóa cho các kịch bản lạc quan, chúng tôi sẽ nghiên cứu sâu hơn về Ký hiệu Big O và sử dụng nó thực tế để thực hiện hàng ngày của chúng ta mã ngày nhanh hơn.第 4 章、第 5 章和第 6 章,进一步探索大 O 记法,并以实例来演示如何利用它来加快代码运行速度。
Trong quá trình này, chúng tôi sẽ đề cập đến các thuật toán sắp xếp khác nhau, bao gồm Sắp xếp bong bóng, Sắp xếp lựa chọn và Sắp xếp chèn.这一路上,我们还会提到各种排序算法,包括冒泡排序、选择排序和插入排序。
Trong Chương 7 và 8: Tra cứu nhanh chóng mặt với Bash Tables và Crafting Elegant Code thảo luận về một số cấu trúc dữ liệu bổ sung, bao gồm bảng băm, ngăn xếp và hàng đợi.第 7 章和第 8 章会再探讨几种数据结构,包括散列表、栈和队列,展示它们对代码速度和可读性的影响,并学会用其解决实际问题。
Trong Chương 9, chúng tôi sẽ chỉ ra những điều này ảnh hưởng như thế nào đến tốc độ và độ sang trọng của mã của chúng tôi và sử dụng chúng để giải quyết các vấn đề trong thế giới thực.第 9 章会介绍递归,计算机科学中的核心概念。
Đệ quy đệ quy với đệ quy giới thiệu đệ quy, một khái niệm neo trong thế giới khoa học máy tính.我们会对其进行分解,考察它在某些问题上
Trong Chương 10, chúng ta sẽ phân tích nó và xem nó có thể là một công cụ tuyệt vời như thế nào cho một số tình huống nhất định.的利用价值。第 10 章会运用递归来实现一些飞快的算法,例如快速排序和快速选择,提升读者的算法开发能力。
Trong Chương 11 và 12: Thuật toán đệ quy cho tốc độ sẽ sử dụng đệ quy làm nền tảng cho các thuật toán cực nhanh như Quicksort và Quickselect, đồng thời nâng cao kỹ năng phát triển thuật toán của chúng tôi lên một vài khía cạnh.第 11 章、第 12 章和第 13 章会探索基于结点的数据结构,包括链表、二叉树和图,并展示它们在各种应用中的完美表现。
Các chương sau, Chương 13 và 14: Cấu trúc dữ liệu dựa trên nút, Tăng tốc tất cả mọi thứ và Kết nối mọi thứ với đồ thị, khám phá các cấu trúc dữ liệu dựa trên nút bao gồm danh sách được liên kết, cây nhị phân và biểu đồ và chỉ ra cách lý tưởng cho các ứng dụng khác nhau.最后一章,第 14 章,介绍空间复杂度。
Chương cuối cùng, Giải quyết các Ràng buộc về Không gian, khám phá sự phức tạp về không gian, điều này rất quan trọng khi lập trình cho các thiết bị có dung lượng đĩa tương đối nhỏ hoặc khi xử lý dữ liệu lớn.当程序运行环境的内存空间不多,或处理的数据量很大时,理解空间复杂度便显得特别重要。
Cách đọc cuốn sách này如何阅读本书
Bạn phải đọc cuốn sách này theo thứ tự.你得按顺序从第 1 章开始读起。
Có những cuốn sách mà bạn có thể đọc từng chương một cách độc lập và bỏ qua một chút, nhưng đây không phải là một trong số chúng.虽然有些书允许读者单独翻阅某些章节,或跳过某些章节, 但这本不是。
Mỗi chương giả định rằng bạn đã đọc những chương trước và cuốn sách được xây dựng cẩn thận để bạn có thể nâng cao hiểu biết của mình khi tiếp tục.本书的每一章都假定你已经读过其之前的内容,而且全书内容也确实是精心安排的, 使得你在按序阅读的过程中逐步提高认知水平。
Một lưu ý quan trọng khác: để làm cho cuốn sách này dễ hiểu, tôi không phải lúc nào cũng tiết lộ mọi thứ về một khái niệm cụ thể khi tôi giới thiệu nó.此外还有很重要的一点:为了易于大家理解,当介绍一个概念时,我可能不会把它一下子全部展露出来。
Đôi khi, cách tốt nhất để phá vỡ một khái niệm phức tạp là tiết lộ một phần nhỏ của nó và chỉ tiết lộ phần tiếp theo khi phần đầu tiên đã chìm vào trong.有时候,理解一个复杂概念的最好方法就是把它拆分成小块,并且在完全明白某一块以后才去着手其他部分。
Nếu tôi định nghĩa một thuật ngữ cụ thể như-và-như vậy, đừng coi đó là định nghĩa sách giáo khoa cho đến khi bạn hoàn thành toàn bộ phần về chủ đề đó.要是我在描述某个术语时说得比较模糊,千万别把它当成一个完整的定义,想看清该术语的全貌,你得读完关于它的所有内容才行。
Đó là một sự đánh đổi: để làm cho cuốn sách dễ hiểu, lúc đầu, tôi đã chọn đơn giản hóa một số khái niệm nhất định và làm rõ chúng theo thời gian, thay vì đảm bảo rằng mọi câu đều hoàn toàn chính xác về mặt học thuật.这其实是一种权衡:为了便于理解,我只能把一个概念先极度简化,然后再一步步去完善。
Nhưng đừng lo lắng quá, vì cuối cùng, bạn sẽ thấy toàn bộ bức tranh chính xác.当然这就导致了有些句子写得不够彻底、不够学术,或不够精确。但无须担心,因为到最后你一定能对它有一个完整的印象。

Leave a Reply

Your email address will not be published. Required fields are marked *