✨Giải thuật tìm kiếm

Giải thuật tìm kiếm

Trong ngành khoa học máy tính, một giải thuật tìm kiếm là một thuật toán lấy đầu vào là một bài toán và trả về kết quả là một lời giải cho bài toán đó, thường là sau khi cân nhắc giữa một loạt các lời giải có thể. Hầu hết các thuật toán được nghiên cứu bởi các nhà khoa học máy tính để giải quyết các bài toán đều là các thuật toán tìm kiếm. Tập hợp tất cả các lời giải có thể đối với một bài toán được gọi là không gian tìm kiếm. Thuật toán thử sai (brute-force search) hay các thuật toán tìm kiếm "sơ đẳng" không có thông tin sử dụng phương pháp đơn giản nhất và trực quan nhất. Trong khi đó, các thuật toán tìm kiếm có thông tin sử dụng heuristics để áp dụng các tri thức về cấu trúc của không gian tìm kiếm nhằm giảm thời gian cần thiết cho việc tìm kiếm.

Tìm kiếm không có thông tin

Một giải thuật tìm kiếm không có thông tin là giải thuật không tính đến bản chất cụ thể của bài toán. Khi đó, các giải thuật dạng này có thể được cài đặt tổng quát, và cùng một cài đặt có thể được sử dụng trong một diện rộng các bài toán (do sử dụng trừu tượng hóa). Nhược điểm của các giải thuật này là phần lớn các không gian tìm kiếm kích thước cực kì lớn, và một quá trình tìm kiếm (đặc biệt tìm kiếm theo cây) sẽ cần một khoảng thời gian đáng kể cho các ví dụ nhỏ. Do đó, để tăng tốc độ quá trình tìm kiếm, đôi khi chỉ có thể dùng giải thuật tìm kiếm có thông tin.

Tìm kiếm trên danh sách

Có lẽ các giải thuật tìm kiếm trên danh sách là loại giải thuật tìm kiếm cơ bản nhất. Mục đích là tìm trong một tập hợp một phần tử chứa một khóa nào đó. Do đây là một bài toán thường gặp trong khoa học máy tính, nên độ phức tạp tính toán của các thuật toán này đã được nghiên cứu kỹ càng. Thuật toán đơn giản nhất là tìm kiếm tuyến tính. Thuật toán này kiểm tra từng phần tử trong danh sách theo thứ tự của danh sách đó. Nó có thời gian chạy khá lớn: O(n), trong đó n là số phần tử trong danh sách, nhưng có thể sử dụng thẳng cho một danh sách bất kỳ mà không cần tiền xử lý. Tìm kiếm nhị phân là một thuật toán cao cấp hơn với thời gian chạy là O(log n). Đối với các danh sách lớn, thuật toán này tốt hơn hẳn tìm kiếm tuyến tính, nhưng nó đòi hỏi danh sách phải được sắp xếp từ trước (xem thuật toán sắp xếp) và đòi hỏi khả năng truy nhập ngẫu nhiên (random access). Tìm kiếm nội suy (Interpolation search) tốt hơn tìm kiếm nhị phân đối với các danh sách rất lớn với phân bố gần đều. Thuật toán Grover là một thuật toán lượng tử cho phép tăng tốc độ gấp 4 lần so với tìm kiếm tuyến tính truyền thống trên các danh sách chưa được sắp xếp.

Bảng băm (hash table) cũng được dùng cho tìm kiếm trên danh sách. Nó đòi hỏi thời gian hằng số trong trường hợp trung bình, nhưng lại cần nhiều phụ phí về không gian bộ nhớ và thời gian chạy O(n) cho trường hợp xấu nhất. Một phương pháp tìm kiếm khác dựa trên các cấu trúc dữ liệu chuyên biệt sử dụng cây tìm kiếm nhị phân cân bằng (self-balancing binary search tree) và đòi hỏi thời gian chạy O(log n); các giải thuật loại này có thể coi là mở rộng của tư tưởng chính về tìm kiếm nhị phân để cho phép chèn và xóa nhanh. Xem mảng liên kết (associative array) để biết thêm về các cấu trúc dữ liệu tìm kiếm trên danh sách.

Đa số các giải thuật tìm kiếm trên danh sách, chẳng hạn tìm kiếm tuyến tính, tìm kiếm nhị phân, và cây tìm kiếm nhị phân cân bằng, có thể được mở rộng với một chút chi phí bổ sung để tìm tất cả các giá trị nhỏ hơn hoặc lớn hơn một khóa cho trước - một phép toán được gọi là tìm kiếm khoảng (range search). Bảng băm là ngoại lệ, các tìm kiếm khoảng không thể được thực hiện một cách hiệu quả trên bảng băm.

Tìm kiếm trên cây

Tìm kiếm trên cây là trung tâm của các kỹ thuật tìm kiếm. Các thuật toán này tìm kiếm trên các cây gồm các nút, cây này có thể là cây tường minh hoặc được xây dựng dần trong quá trình tìm kiếm. Nguyên lý cơ bản là: một nút được lấy ra từ một cấu trúc dữ liệu, các nút con của nó được xem xét và bổ sung vào cấu trúc dữ liệu đó. Bằng cách thao tác trên cấu trúc dữ liệu này, cây tìm kiếm được duyệt theo các thứ tự khác nhau, chẳng hạn theo từng mức (tìm kiếm theo chiều rộng) hoặc đi tới một nút lá trước rồi quay lui (tìm kiếm theo chiều sâu). Các ví dụ khác về tìm kiếm trên cây bao gồm: tìm kiếm lặp sâu dần, tìm kiếm chiều sâu giới hạn, tìm kiếm hai chiều và tìm kiếm chi phí đều

Tìm kiếm trên đồ thị

Nhiều bài toán về lý thuyết đồ thị có thể được giải quyết bằng các thuật toán tìm kiếm, chẳng hạn thuật toán Dijkstra, thuật toán Kruskal, giải thuật láng giềng gần nhất và giải thuật Prim. Các thuật toán này có thể được coi là các mở rộng của các thuật toán tìm kiếm trên cây.

Tìm kiếm có thông tin

Trong tìm kiếm có thông tin, người ta sử dụng một đánh giá heuristic đặc thù cho bài toán cần giải quyết với vai trò hướng dẫn cho quá trình tìm kiếm. Một cách đánh giá heuristic tốt sẽ làm cho quá trình tìm kiếm có thông tin hoạt động hiệu quả hơn hẳn một phương pháp tìm kiếm không có thông tin bất kỳ.

Có một vài thuật toán tìm kiếm có thông tin nổi trội dành cho danh sách. Một trong số đó là một bảng băm với một hàm băm là một heuristic dựa trên bài toán đang được giải. Đa số các thuật toán tìm kiếm có thông tin đều là tìm kiếm trên cây. Trong đó có tìm kiếm theo lựa chọn tốt nhất và A*. Cũng như các thuật toán không có thông tin, các thuật toán này có thể được mở rộng để làm việc trên cả các đồ thị.

Tìm kiếm đối kháng

Trong các trò chơi như cờ vua hay cờ tướng, có một cây trò chơi bao gồm tất cả các nước đi có thể của cả hai đấu thủ và các cấu hình bàn cờ là kết quả của các nước đi đó. Ta có thể tìm kiếm trên cây này để có được một chiến lược chơi hiệu quả. Dạng bài toán này có đặc điểm độc nhất vô nhị là ta phải tính đến mọi nước đi mà đối thủ của ta có thể sử dụng. Để làm điều này, các chương trình máy tính chơi cờ, cũng như các dạng khác của trí tuệ nhân tạo như lập kế hoạch tự động (machine planning), thường sử dụng các thuật toán tìm kiếm như thuật toán minimax, tỉa cây tìm kiếm, và tỉa cây alpha-beta (alpha-beta pruning).

Thỏa mãn ràng buộc

Đây là một loại tìm kiếm để giải quyết các bài toán thỏa mãn ràng buộc mà trong đó, thay vì tìm một đường đi, lời giải chỉ đơn giản là một tập các giá trị được gán cho một tập các biến. Do các biến có thể được xử lý theo thứ tự tùy ý, các thuật toán thông thường dành cho tìm kiếm trên cây rất không hiệu quả. Các phương pháp giải các bài toán ràng buộc bao gồm tìm kiếm tổ hợp và quay lui, cả hai đều tận dụng các đặc điểm tự do có liên quan đến các bài toán ràng buộc.

Các loại khác

  • Các thuật toán tìm xâu ký tự (String searching algorithm) tìm kiếm các mẫu trong các xâu ký tự; cây hậu tố (suffix tree) là một cấu trúc dữ liệu thông dụng có tác dụng làm tăng hiệu quả của các thuật toán này
  • Giải thuật di truyền hay thuật toán gien sử dụng ý tưởng tiến hóa để làm các heuristic cho việc giảm không gian tìm kiếm
  • Các thuật toán sắp xếp cần thiết cho việc thực thi một số thuật toán tìm kiếm nhất định
  • Giả lập luyện thép là một thuật toán tìm kiếm xác suất
  • Tìm kiếm Tabu là một kỹ thuật tránh việc các quá trình tìm kiếm rời rạc bị tắc trong các cực tiểu địa phương
  • Tìm kiếm liên bang (Federated search)
  • Giải thuật Minimax được tối ưu hóa bằng kỹ thuật tỉa cây alpha-beta là một thuật toán dành cho tìm kiếm các nước đi tốt trong các trò chơi tổng bằng không
👁️ 0 | 🔗 | 💖 | ✨ | 🌍 | ⌚
Trong ngành khoa học máy tính, một **giải thuật tìm kiếm** là một thuật toán lấy đầu vào là một bài toán và trả về kết quả là một lời giải cho bài toán đó,
Trong khoa học máy tính, **A*** (đọc là _A sao_) là thuật toán tìm kiếm trong đồ thị. Thuật toán này tìm một đường đi từ một nút khởi đầu tới một nút đích cho
Trong khoa học máy tính, **tìm kiếm nhị phân** (), còn gọi là **tìm kiếm nửa khoảng** (_half-interval search_), **tìm kiếm logarit** (_logarithmic search_), hay **chặt nhị phân** (_binary chop_), là một thuật toán tìm
**Tìm kiếm ưu tiên chiều sâu** hay **tìm kiếm theo chiều sâu** () là một thuật toán duyệt hoặc tìm kiếm trên một cây hoặc một
Trong Khoa học máy tính **tìm kiếm tuần tự** (tiếng Anh _Sequential search_) hay **tìm kiếm tuyến tính** (tiếng Anh _linear search_) là một phương pháp tìm kiếm một phần tử cho trước trong một
**Tìm kiếm theo lựa chọn tốt nhất** (tiếng Anh: _Best-first search_) là một thuật toán tìm kiếm tối ưu hóa tìm kiếm theo chiều rộng bằng cách mở rộng nút hứa hẹn nhất được chọn
nhỏ|310x310px|Mô phỏng tìm kiếm trên cây tìm kiếm theo thuật toán tìm kiếm theo chiều rộng Trong lý thuyết đồ thị, **tìm kiếm theo chiều rộng** (**BFS**) là một thuật toán tìm kiếm trong đồ
**Giải thuật di truyền** là một kỹ thuật của khoa học máy tính nhằm tìm kiếm giải pháp thích hợp cho các bài toán tối ưu tổ hợp (_combinatorial optimization_). Giải thuật di truyền là
Trong khoa học máy tính, **tìm kiếm chi phí đều** (hay còn gọi là _tìm kiếm chi phí cực tiểu_ hoặc _tìm kiếm theo giá thành thống nhất_, viết tắt tiếng Anh là UCS) là
Trong thống kê, **giải thuật _k_ hàng xóm gần nhất** (hay còn gọi là **thuật toán k hàng xóm gần nhất**, viết tắt từ tiếng Anh **_k_-NN**) là một phương pháp thống kê phi tham
**Phân tích tìm kiếm** (Search analytics) là việc phân tích các truy vấn tìm kiếm được nhập bởi người dùng của một công cụ tìm kiếm (Search tool) cụ thể (Ví dụ: Google, Bing, Wolfram
**Thuật toán tìm kiếm Grover** là một thuật toán lượng tử dùng trong việc tìm kiếm trên một cơ sở dữ liệu chưa sắp xếp gồm N phần tử trong độ phức tạp về thời
**Search Engine Optimization - Tối ưu hóa công cụ tìm kiếm (SEO)** là quá trình tăng chất lượng và lưu lượng truy cập website bằng cách tăng khả năng hiển thị của website hoặc webpage
** Thuật toán so khớp chuỗi Knuth–Morris–Pratt** (hay **thuật toán KMP**) tìm kiếm sự xuất hiện của một "từ" W trong một "xâu văn bản" S bằng cách tiếp tục quá trình tìm kiếm khi
**Cốc Cốc** là công cụ tìm kiếm mặc đị ## Lịch sử ### Những ngày đầu Cốc Cốc khởi đầu là một dự án của ba sinh viên Việt Nam khi đang theo học Đại
**Phẫu thuật tim** (còn gọi là phẫu thuật lồng ngực) là lĩnh vực y khoa liên quan đến phẫu thuật điều trị các cơ quan bên trong lồng ngực (ngực). Điều trị chung các tình
nhỏ|Search Engine Results Pages - SERP **Trang kết quả của công cụ tìm kiếm** (**Search Engine Results Pages -** **SERP**) là các trang được hiển thị bởi các công cụ tìm kiếm để đáp lại
**Thuật toán Dijkstra**, mang tên của nhà khoa học máy tính người Hà Lan Edsger Dijkstra vào năm 1956 và ấn bản năm 1959, là một thuật toán giải quyết bài toán đường đi ngắn
**Google Tìm kiếm**, cũng được gọi với tên tiếng Anh phổ biến là **Google Search** hay đơn giản là **Google**, là dịch vụ cung cấp chính và quan trọng nhất của công ty Google. Dịch
**Giải thuật vẽ đoạn thẳng của Bresenham ** (tiếng Anh: **Bresenham's line algorithm**) là giải thuật xác định các điểm raster hai chiều cần vẽ để nhận được xấp xỉ gần đúng của đoạn thẳng
thumb|Một chương trình tìm kiếm tài năng của trường Trung học St Ninian tại [[Glasgow, Scotland.]] Một **chương trình tìm kiếm tài năng** là một sự kiện nơi các thí sinh biểu diễn các tiết
**Giải thuật tham lam** (tiếng Anh: _Greedy algorithm_) là một thuật toán giải quyết một bài toán theo kiểu metaheuristic để tìm kiếm lựa chọn tối ưu địa phương ở mỗi bước đi với hy
**Giải thuật Euclid mở rộng** được sử dụng để giải một phương trình vô định nguyên (còn được gọi là phương trình Đi-ô-phăng) có dạng
ax + by =c
Trong đó a, b, c
**Thuật toán Johnson** được Donald B. Johnson tìm ra năm 1977. Thuật toán Johnson là một thuật toán giải quyết bài toán đường đi ngắn nhất giữa mọi cặp đỉnh trong đồ thị có hướng,
right|thumb|Tìm kiếm vùng đơn hình. Dạng tổng quát nhất của bài toán **tìm kiếm vùng** là như sau: xử lý và lưu trữ một tập hợp _S_ các đối tượng, sao cho có thể xác
**Thuật toán phân tán** là một thuật toán được thiết kế để chạy trên phần cứng máy tính được xây dựng từ các bộ vi xử lý kết nối. Các thuật toán phân tán được
Bài viết này là **danh sách các thuật toán** cùng một mô tả ngắn cho mỗi thuật toán. ## Thuật toán tổ hợp ### Thuật toán tổ hợp tổng quát * Thuật toán Brent: tìm
Trong tài chính, **phân tích kỹ thuật** là một phương pháp phân tích chứng khoán dự báo hướng của giá cả thông qua việc nghiên cứu các dữ liệu thị trường quá khứ, chủ yếu
**Quay lui** (tiếng Anh: _backtracking_) là một chiến lược tìm kiếm lời giải cho các bài toán thỏa mãn ràng buộc. Người đầu tiên đề ra thuật ngữ này (_backtrack_) là nhà toán học người
nhỏ|315x315px|Một danh bạ điện thoại nhỏ được xem như một bảng băm. Trong khoa học máy tính, **bảng băm** là một cấu trúc dữ liệu sử dụng hàm băm để ánh xạ từ giá trị
nhỏ Trong lý thuyết đồ thị, **bài toán đường đi ngắn nhất nguồn đơn** là bài toán tìm một đường đi giữa hai đỉnh sao cho tổng các trọng số của các cạnh tạo nên
phải|Một hàm băm tiêu biểu đang hoạt động **Hàm băm** (tiếng Anh: _hash function_) là giải thuật nhằm sinh ra các **giá trị băm** tương ứng với mỗi **khối dữ liệu** (có thể là một
thumb|Tarjan's Algorithm Animation **Thuật Toán Tarjan** (được đặt theo tên của người tìm ra nó - Robert Tarjan) là một thuật toán trong lý thuyết đồ thị dùng để tìm thành phần liên thông mạnh
**Minimax** (còn gọi là **minmax**) là một phương pháp trong lý thuyết quyết định có mục đích là tối thiểu hóa (_mini_mize) tổn thất vốn được dự tính có thể là "tối đa" (_max_imize). Có
**Thuật toán Ford- Fulkerson** (đặt theo L. R. Ford và D. R. Fulkerson) tính toán luồng cực đại trong một mạng vận tải. Tên Ford-Fulkerson cũng thường được sử dụng cho thuật toán Edmonds-Karp, một
**_Tìm kiếm tài năng: Vietnam’s Got Talent_**, thường được biết đến với tên đơn giản hơn là **_Tìm kiếm tài năng Việt Nam_** (viết tắt tiếng Anh: _VGT_)_,_ là một chương trình truyền hình tìm
**Thuật toán Bellman–Ford** hay **Giải thuật Bellman–Ford** là một thuật toán tính các đường đi ngắn nhất nguồn đơn trong một đồ thị có hướng có trọng số (trong đó một số cung có thể
Lễ trao giải tháng 12 năm 2023 tại Nhà hát Hồ Gươm **VinFuture** là giải thưởng khoa học và công nghệ toàn cầu, thành lập ngày 20 tháng 12 năm 2020 với sứ mệnh "tạo
Trong khoa học máy tính, **thuật toán Kosaraju-Sharir** là một thuật toán tìm thành phần liên thông mạnh trong đồ thị có hướng. Theo Aho, Hopcroft và Ullman, thuật toán này xuất hiện trong một
**Cây tìm kiếm nhị phân** (viết tắt tiếng Anh: BST - _Binary Search Tree_) là một cấu trúc dữ liệu rất thuận lợi cho bài toán tìm kiếm. Mỗi cây tìm kiếm nhị phân đều
**Thuật toán ghép cặp của Edmonds** (còn gọi là thuật toán bông hoa) là một thuật toán trong lý thuyết đồ thị để tìm cặp ghép cực đại trong đồ thị. Thuật toán được tìm
**Thuật toán Dinitz** là một thuật toán thời gian đa thức mạnh cho việc tìm luồng cực đại trên đồ thị luồng, tìm ra năm 1970 bởi nhà nghiên cứu khoa học máy tính người
Trong khoa học máy tính, **thuật toán Prim** là một thuật toán tham lam để tìm cây bao trùm nhỏ nhất của một đồ thị vô hướng có trọng số liên thông. Nghĩa là nó
**Thuật toán Borůvka** là một thuật toán để tìm cây bao trùm nhỏ nhất trên đồ thị. Thuật toán này được xuất bản lần đầu năm 1926 bởi Otakar Borůvka dưới dạng một phương pháp
Trong khoa học máy tính và lý thuyết đồ thị, **thuật toán Edmonds–Karp** là một trường hợp đặc biệt của thuật toán Ford–Fulkerson cho việc tìm luồng cực đại trong mạng. Nó có độ phức
**_Tìm kiếm tài năng châu Á (Asia's Got Talent)_** là một chương trình truyền hình tương tác mua lại bản quyền của _Got Talent_ phát sóng trên kênh AXN. Đây là một cuộc thi tài
thumb|[[Vincent van Gogh, tháng 7 năm 1890, _Đồng lúa và những con quạ_.]] **Tâm lý học mỹ thuật** là một lĩnh vực liên ngành nghiên cứu về quan niệm, nhận thức và đặc điểm của
Một **công dân kỹ thuật số** () là người có kỹ năng sử dụng công nghệ thông tin để giao tiếp với người khác, tham gia vào các hoạt động xã hội, kinh doanh và
phải|nhỏ|[[Lưu đồ thuật toán (thuật toán Euclid) để tính ước số chung lớn nhất (ưcln) của hai số _a_ và _b_ ở các vị trí có tên A và B. Thuật toán tiến hành bằng
là một bộ manga do Arakawa Hiromu sáng tác kiêm minh họa. Thế giới trong _Cang giả kim thuật sư_ được xây dựng theo phong cách châu Âu thời cách mạng công nghiệp. Bộ truyện