Tải bản đầy đủ (.doc) (6 trang)

Thuật toán tìm kiếm string gần đúng như google pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (137.77 KB, 6 trang )

Thuật toán tìm kiếm string gần đúng
gửi bởi tienlbhoc » T.Năm 10/04/2008 2:39 pm
mới chế cái code tìm kiếm gần đúng , nhờ mọi người cho ý kiến cái :
Tư tưởng như sau:
+Đầu tiên kiểm tra độ dài string so sánh :ít hay hơn 30% thì loại
+Tiếp là so sánh từng ký tự của 2 string nếu không bằng nhau thì so sánh các từ lân cận
tiếp theo của cả 2 string
Trong khoảng sai số nếu có , thì chỉnh lại vị trí i,j là chỉ số của 2 string đó, cái này sẽ
kiểm tra các lỗi thừa hay thiếu từ , nếu có thì số lỗi là số ký tự phải chỉnh lại vị trí i,j .còn
nếu không thì cho lỗi là 1 , đọc ký tự kế tiếp
+Cuối cùng , khi 1 trong 2 string đã đi hết
thì còn mẩu đuôi ta làm : loi += s.Length - i + s1.Length - j;
tức là nếu 1 string còn thừa thì cho mẩu đó là lỗi cộng vào
nếu số lỗi <=30% thì là đạt , không thì không đạt
Code rất ngắn (để tốc độ cho nhanh mà):
Mã: Chọn tất cả
1. class ApproximatString
2. {
3. string s;
4. int i, j, k, loi, saiSo;
5. public ApproximatString(string nhap)
6. {
7. s = nhap;
8. saiSo = (int)Math.Round(s.Length * 0.3);
9. }
10. public bool SoSanh(string s1)
11. {
12. if (s1.Length < (s.Length - saiSo) ||
s1.Length > (s.Length + saiSo))
13. return false;
14. i = j = loi = 0;


15. while (i < s.Length && j < s1.Length)
16. {
17. if (s[i] != s1[j])
18. {
19. loi++;
20. for (k = 1; k <= saiSo; k++)
21. {
22. if ((i + k < s.Length) &&
s[i + k] == s1[j])
23. {
24. i += k;
25. break;
26. }
27. else if ((j + k <
s1.Length) && s[i] == s1[j + k])
28. {
29. j += k;
30. break;
31. }
32. }
33. }
34. i++;
35. j++;
36. }
37. loi += s.Length - i + s1.Length - j;
38. if (loi <= saiSo)
39. return true;
40. else return false;
41. }
42. }

Còn đây là kết quả:
Sửa lần cuối bởi tienlbhoc vào ngày T.Năm 18/09/2008 2:17 pm với 1 lần sửa.
Diễn đàn và blog phần mềm tự làm :
/> />tienlbhoc
Thành viên tâm huyết

Bài viết: 410
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Đầu trang
Re: Thuật toán tìm kiếm string gần đúng
gửi bởi ngaymaikhongtan » T.Bảy 12/04/2008 7:23 am
Ý tưởng cũng khá hay, nhưng minh vẩn không hĩu chổ này, bạn giải thích cho mình rỏ
nhe, tai sao bạn chọn kiểm tra độ dài string so sánh :ít hay hơn 30% thì loại, tại sao bạn
lại chọn mức la 30% vậy!
welcome to

ngaymaikhongtan
Thành viên chính thức

Bài viết: 39
Ngày tham gia: T.Bảy 29/03/2008 12:05 pm
Đến từ: Cà Mau
• Tài khoản Yahoo
Đầu trang
Re: Thuật toán tìm kiếm string gần đúng
gửi bởi tienlbhoc » T.Bảy 12/04/2008 8:03 am
thuật toán trên mình sửa rồi , cái đoạn tìm lân cận chỉ cho mặc định lỗi ++ thôi (vì thế kết
quả sẽ rộng hơn).
Còn vì sao là 30% vì 20% mình thử thấy hơi ít 40% thấy hơi nhiều , con số này tuỳ theo

thực nghiệm mà chỉnh thôi .
Còn vì sao mà độ dài lớn hơn hoặc nhỏ hơn 30% vì ví dụ a so sánh với application , thì
dài thế này có cần phải so sánh nữa không hả , làm chậm chương trình.
Mã: Chọn tất cả
1. class ApproximatString
2. {
3. string s;
4. int i, j, k, loi, saiSo;
5. public ApproximatString(string nhap)
6. {
7. s = nhap;
8. saiSo = (int)Math.Round(s.Length * 0.3);
9. }
10. public bool SoSanh(string s1)
11. {
12. if (s1.Length < (s.Length - saiSo) ||
s1.Length > (s.Length + saiSo))
13. return false;
14. i = j = loi = 0;
15. while (i < s.Length && j < s1.Length)
16. {
17. if (s[i] != s1[j])
18. {
19. loi++;
20. for (k = 1; k <= saiSo; k++)
21. {
22. if ((i + k < s.Length) &&
s[i + k] == s1[j])
23. {
24. i += k;

25. break;
26. }
27. else if ((j + k <
s1.Length) && s[i] == s1[j + k])
28. {
29. j += k;
30. break;
31. }
32. }
33. }
34. i++;
35. j++;
36. }
37. loi += s.Length - i + s1.Length - j;
38. if (loi <= saiSo)
39. return true;
40. else return false;
41. }
42. }
Diễn đàn và blog phần mềm tự làm :
/> />tienlbhoc
Thành viên tâm huyết

Bài viết: 410
Ngày tham gia: T.Bảy 14/07/2007 10:06 pm
Đến từ: Hà Nội
Đầu trang
Re: Thuật toán tìm kiếm string gần đúng
gửi bởi giongto35 » T.Bảy 12/04/2008 10:30 am
Hay thật . Tìm chuẩn quá , hết chỗ chê ,

________________________________________________________________________
________________________
. . . . . . . . . . . . .
giongto35
Advance Member

Bài viết: 197
Ngày tham gia: T.Năm 19/04/2007 10:17 am
Đến từ: Đà Nẵng City
• Tài khoản Yahoo
Đầu trang
Re: Thuật toán tìm kiếm string gần đúng
gửi bởi vinhphuoc91 » T.Bảy 12/04/2008 12:20 pm
Cái này ứng dụng từ điển là ok nhất, hehe phải nhanh chóng paste nó vào chương trình
của mình thôi Cảm ơn tienlbhoc nhiều nhá.
[b][color=#FF0000]Xin lỗi, tạm thời không thể online thường xuyên được, dạo này có
việc bận quá :( [/color][/b]
vinhphuoc91
Advance Member

Bài viết: 146
Ngày tham gia: T.Tư 26/03/2008 5:52 pm
Đến từ: Phú Yên
• Tài khoản Yahoo
Đầu trang
Re: Thuật toán tìm kiếm string gần đúng

×