Chuyển đến nội dung chính

Bài đăng

Hiển thị các bài đăng có nhãn Algorithms

Thuật toán MiniMax

Khi bắt đầu xây dựng trí tuệ nhân tạo (AI) cho các trò chơi đối kháng có chiến thuật như Cờ tướng, Cờ vua, hay Tic-Tac-Toe, thuật toán đầu tiên và là nền móng cho mọi engine hiện đại chính là Minimax . Để hiểu bản chất của Minimax, chúng ta không cần lao ngay vào những thế cờ phức tạp. Hãy cùng quay ngược thời gian, bước vào một bàn tiệc luận anh hùng giữa hai nhân vật lẫy lừng thời Tam Quốc: Tào Tháo và Lưu Bị . 1. Điển Tích "Chia Báu Vật" Giữa Tào Tháo Và Lưu Bị Giả sử Tào Tháo và Lưu Bị bắt gặp 4 chiếc hòm chứa lượng vàng khác nhau. Tào Tháo (đại diện cho AI ) được quyền chọn trước một trong hai lối đi dẫn đến các cặp hòm. Tuy nhiên, Lưu Bị (đại diện cho Đối thủ ) lại là người được quyền mở chiếc hòm cuối cùng trong lối đi đó để lấy vàng. Mục tiêu của hai người hoàn toàn trái ngược nhau: Tào Tháo (AI / Maximizer): Luôn muốn chọn lối đi sao cho lượng vàng nhận được là lớn nhất (Max) . Lưu Bị (Đối thủ / Minimizer): Luôn muốn chọn chiếc hòm sao cho lượn...

Sơ lược về các thuật toán mã hóa: MD5, SHA1, SHA256

Hash Function (Hàm băm) là gì? Hàm băm là một hàm toán học nhận đầu vào là một chuỗi dữ liệu (văn bản, tệp tin, mật khẩu...) với độ dài bất kỳ, và trả về một chuỗi giá trị cố định (gọi là mã băm – hash value, digest hoặc checksum). Ví dụ: Input: "ChatGPT" Output (MD5): 62290c06718fbef3ca1e3be8a5a145f2 Đặc điểm chính của một hàm băm Đầu ra cố định (Fixed-length output) Dù bạn nhập 10 ký tự hay 10.000 ký tự, kết quả băm luôn có độ dài như nhau. MD5: 128 bit SHA-1: 160 bit SHA-256: 256 bit SHA-512: 512 bit VD: Nhatkyhoctap -> df30cb178eb8e37728f39b3e6551c8de https://www.md5hashgenerator.com/ -> bd041e3f1821cbb99795412b64508a05 Không thể đảo ngược (One-way function) Rất khó – gần như không thể – tìm ra dữ liệu gốc chỉ từ mã băm. Tính kháng va chạm (Collision resistance) Không nên có hai đầu vào khác nhau cho ra cùng một mã băm. Nếu điều này xảy ra, thuật toán được coi là yếu. Deterministic – Tính xác định Cùng một đầu vào luôn cho ra cùng một kết quả băm. Ví dụ: Hash(...

Sudoku: Naked Triple

Naked Triple xảy ra khi có 3 ô trong cùng một hàng, cột hoặc vùng 3x3 và chúng chỉ chứa đúng 3 ứng viên (số) khác nhau, bất kể thứ tự hoặc sự trùng lặp. ➡ Khi đó, ta biết chắc chắn rằng 3 số đó sẽ phải nằm trong chính 3 ô này, và chúng sẽ không thể xuất hiện ở bất kỳ ô nào khác trong cùng vùng/hàng/cột. Vị trí 3 ô tạo thành Naked Triple: Trong cột thứ 2, có 3 ô được tô màu xanh lá: Ô B2 (hàng 2, cột 2): có ứng viên 2, 8 Ô C2 (hàng 3, cột 2): có ứng viên 2, 9 Ô H2 (hàng 8, cột 2): có ứng viên 2, 8, 9 ➡ Tổng hợp lại, 3 ô này chỉ chứa 3 ứng viên: 2, 8 và 9 📢 Đây chính là một Naked Triple trong cột 2.

Sudoku: Claiming Candidates

Kỹ thuật Claiming Candidates (còn gọi là Pointing Candidates) là một chiến thuật trung cấp rất hiệu quả trong Sudoku, giúp loại trừ các con số (candidates) trong một khu vực cụ thể. Claiming Candidates xảy ra khi: Một con số (ứng viên) chỉ xuất hiện trong một hàng hoặc cột duy nhất bên trong một vùng 3×3. ➡ Điều đó có nghĩa là: con số đó phải nằm ở hàng hoặc cột đó, nên ta có thể loại bỏ nó khỏi các ô khác cùng hàng hoặc cột ngoài vùng 3×3 đó.

Sudoku: Naked Pair

Naked Pair là gì? Naked Pair xảy ra khi hai ô trong cùng một hàng, cột hoặc vùng 3×3 chỉ chứa chính xác hai số giống nhau, ví dụ như: {1, 3} và {1, 3}. ➡ Vì hai con số đó phải nằm trong hai ô này, chắc chắn chúng không thể xuất hiện ở bất kỳ ô nào khác trong hàng/cột/vùng đó. Xem hình Sudoku dưới đây:   Hai ô màu xanh ở cột 1 (A3 và H3) đều có {1, 3}. Đây chính là một naked pair trong cột. ⇒ Kết luận: Tất cả các ô còn lại trong cột 1 phải loại bỏ số 1 và 3  

Sudoku: Simple coloring

Simple Coloring (hay còn gọi là Single’s Chains) trong Sudoku là một kỹ thuật giải nâng cao dùng để loại bỏ các con số (candidates) dựa trên việc tô màu xen kẽ cho các chuỗi liên kết đơn (single chains) của một con số cụ thể trong lưới Sudoku. Xác định số cụ thể Đây là kỹ thuật chỉ xét   một con số cụ thể   (ví dụ số 7), sau đó tìm các   ứng viên còn lại   của số đó trong những hàng, cột, hoặc khối   chỉ còn đúng 2 ô   chứa số đó. Ta gọi các cặp này là các   bi-location links   – liên kết hai vị trí. Xây dựng chuỗi (chain) Đây là kỹ thuật chỉ xét   một con số cụ thể   (ví dụ số 7), sau đó tìm các   số còn lại   của số đó trong những hàng, cột, hoặc khối   chỉ còn đúng 2 ô   chứa số đó. Ta gọi các cặp này là các   bi-location links   – liên kết hai vị trí. Tô màu các ô – Xây chuỗi logic Khi đã có chuỗi, ta   tô màu xen kẽ   hai ô một màu. Ví dụ: Coloring Contradiction – Mâu thuẫn màu A1 – F6: màu ...

Sử dụng Fluent Validation để validate cho bài toán đệ quy

Trong bài viết này, mình sẽ đưa ra 2 bài toán tương tự nhau, sử dụng Fluent Validation để validate cho bài toán đệ quy Tính giai thừa Ý tưởng cho việc sử dụng Fluent Validation để validate bài toán đệ quy là chia bài toán thành các bước con nhỏ, và áp dụng Fluent Validation để validate từng bước nhỏ này. Điều này giúp tách bài toán lớn thành những bài toán nhỏ hơn và dễ quản lý hơn. Giả sử chúng ta có hàm tính giai thừa Console.WriteLine("Please Enter a Number"); //read number from user var number =Convert.ToInt32(Console.ReadLine()); //invoke the static method var factorial = Factorial(number); //print the factorial result Console.WriteLine("factorial of"+number+"="+factorial.ToString()); public static int Factorial(int number) { if (number == 0) return 1; var factorial = 1; for (int i = number; i >= 1;i-- ) { factorial = factorial * i; } return factorial; } Luôn có 1 điểm bắt và có 1 hoặc nhiều điểm dừng trong bài toán đệ quy if (numb...

Đếm số chữ số thập phân khi chia 2 số

 Link: https://www.geeksforgeeks.org/count-number-digits-decimal-dividing-number/ We are given two numbers A and B. We need to calculate the number of digits after decimal. If in case the numbers are irrational then print “INF”. Examples:   Input : x = 5, y = 3 Output : INF 5/3 = 1.666.... Input : x = 3, y = 6 Output : 1 3/6 = 0.5 The idea is simple we follow school division and keep track of remainders while dividing one by one. If remainder becomes 0, we return count of digits seen after decimal. If remainder repeats, we return INF. // C# program to count digits after dot when a // number is divided by another. using System; using System.Collections.Generic; class GFG { static int count(int x, int y) { int ans = 0; // Initialize result var m = new Dictionary<int,int>(); // calculating remainder while (x % y != 0) { x = x % y; ans++; // if this remainder appeared before then // the numb...

Bài toán rải đậu

Mình đang gặp 1 vấn đề về việc phân phối số thập phân vào mảng cho trước nên viết bài này để ôn lại kiến thức giải thuật Bài toán 1 Giả sử có n hũ dùng để chứa các hạt đậu. m là tổng số hạt đậu trong túi. Điều kiện: n, m > 0. n, m là số nguyên dương Hãy phân phối đều các hạt đậu vào các hũ với sự chênh lệch số đậu mỗi hũ ít nhất là 1. Input 1: 5, 3 Input 2: 5, 8 Input 3: 5, 17 Bài toán 2 Giả sử có n hũ dùng để chứa các hạt đậu. m là tổng số hạt đậu trong túi. Có 2 loại hũ: hũ trắng: chưa chứa hạt đậu nào, hủ đỏ đã chứa sẵn 1 hạt đậu. Điều kiện: n, m > 0. n, m là số nguyên dương Hãy phân phối đều các hạt đậu vào các hũ với sự chênh lệch số đậu mỗi hũ ít nhất là 1. Input 1: 5, 3 [0,1,0,0,0] Input 2: 5,8 [0,1,0,1,0] Input 3: 5,17 [0,0,0,0,0]  Bài toán 3 Giả sử có n hũ dùng để chứa các hạt đậu. m là tổng số hạt đậu trong túi. Có 2 loại hũ: hũ trắng: chưa chứa hạt đậu nào, hủ đỏ đã chứa sẵn 1 hạt đậu. Điều kiện: n, m > 0. n là số nguyên dương, m là số thực Hãy phân phối đều các...

Geeksfor Geeks

  GeeksforGeeks trang web này tổng hợp rất nhiều bài viết code bổ ích về nhiều lĩnh vực như thuật toán và cấu trúc dữ liệu, cũng như là các bài toán đầy thử thách và hấp dẫn. Nếu bạn đang chuẩn bị tham gia một buổi phỏng vấn xin việc và muốn luyện tập trước nhà tuyển dụng thì đây chính là địa chỉ tin cậy để bạn ôn luyện và trau rồi.

Ôn lại kỹ năng lập trình trên Leetcode

Lâu rồi mình chưa làm lại thuật toán. Mình thấy trang Leetcode khá hay, dùng để ôn lại môn Cấu trúc dữ liệu và Giải thuật. Tuy nhiên, bạn cần xem lại kiến thức trước khi giải bài. Mình đã làm thử 1 bài về Merge Sort, thì đây là bài biến tấu, không phải bài dạng cơ bản, và bạn cần ôn lại kiến thức để đưa data về dạng dữ liệu của bài toán MergeSort Merge Sort là gì? Trong khoa học máy tính, sắp xếp trộn (merge sort) là một thuật toán sắp xếp để sắp xếp các danh sách (hoặc bất kỳ cấu trúc dữ liệu nào có thể truy cập tuần tự, v.d. luồng tập tin) theo một trật tự nào đó. Nó được xếp vào thể loại sắp xếp so sánh. Thuật toán này là một ví dụ tương đối điển hình của lối thuật toán chia để trị do John von Neumann đưa ra lần đầu năm 1945. Một thuật toán chi tiết được Goldstine và Neumann đưa ra năm 1948 Do Merge Sort đòi hỏi cần cấp phát vùng bộ nhớ lớn, nên cấu trúc dữ liệu phù hợp là con trỏ Bài toán You are given two integer arrays nums1 and nums2 , sorted in non-decreasing order , and two i...