CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖI
Số trang: 44
Loại file: pdf
Dung lượng: 353.82 KB
Lượt xem: 18
Lượt tải: 0
Xem trước 5 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Tham khảo tài liệu chuỗi và các bài toán trên chuỗi, công nghệ thông tin, hệ điều hành phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Nội dung trích xuất từ tài liệu:
CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖI CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖIChuỗi (string) là một loại dữ liệu cơ bản thường được sử dụng trong rất nhiềucác hệ thống và là thành phần cơ bản trong các hệ thống xử lý văn bản (word -processing-system), các hệ thống này cung cấp cho ta rất nhiều khả năng đ ể xửlý văn bản. Ngoài ra một vài các hệ thống đồ hoạ trên máy tính (computergraphics system) biểu diễn các hình ảnh như là các chuỗi nhị phân.Các thao tác trên chuỗi chúng ta thường gặp một số các phép toán cơ b ản như: - Phép tìm kiếm một chuỗi con trong một chuỗi. - Phép thay thế một chuỗi con của một chuỗi bởi một chuỗi khác. - Phép chen chuỗi con vào một chuỗi. - Phép loại bỏ một chuỗi con của một chuỗi.Trong các phép toán nêu trên thì phép tìm kiếm trên chuỗi là phép toán quantrọng và thường gặp , vì vậy ta chỉ tìm hiểu các giải thuật liên quan đến phéptoán này đó là : 1. G iải thuật Brute-Force. 2. G iải thuật Knuth-Morris-Pratt. 3. G iải thuật Boyer-Moore.$1. Các khái niện cơ bản về chuỗi1.1. Chuỗi và phân chia chuỗia. Đ ịnh nghĩa chuỗiChuỗi là một dãy các ký tự được chứa trong một vùng liên tục của bộ nhớ. Cácký tự này có thể là ký tự chữ, ký tự số hoặc ký tự đặc biệt.Chuỗi ký tự (text string) có thể được xem như là dãy các chữ, các số và các kýtự đặc biệt.Một loại chuỗi khác là chuỗi nhị phân (binary string), đó là một dãy các kí tự 0và 1. 1 Vâ Minh Phæ – Bæ m«n Khoa häc m¸y tÝnhb. Đ ộ dài chuỗi. Số ký tự của chuỗi được gọi là chiều dài của chuỗi. Mỗi ký tựchiếm 1 byte.Một chuỗi có thể có chiều dài bằng 0 gọi là chuỗi rỗng(null string ), ký hiệu là “Một chuỗi có thể đ ược chia làm nhiều phần, mỗi phần là một chuỗi con (substring ). Các chuỗi con có thể có chiều dài bằng nhau hoặc khác nhau.1.2. Cách phân chia chuỗia. Dùng ký tự đặc biệt. Dùng ký tự trống ( blank) để phân chia chuỗi con. Khi đócác chuỗi con có thể khác nhau. Để truy xuất một chuỗi con trong chuỗi thì taphải tìm kiếm từ đầu chuỗi. Do đó tốc độ truy xuất của phương pháp này chậm.b. Dùng chiều dài cố định. Ta chia các chuỗi con thành các phần bằng nhau. Đểtruy xuất một chuỗi con trong một chuỗi thì ta dùng công thức tính địa chỉ. Dođó tốc độ truy xuất của phương pháp này rất nhanh.c. Dùng chỉ điểm (pointer). - D ùng chỉ điểm đầu: Chỉ điểm đầu chỉ vào ký tự đầu tiên của chuỗi con. Ta sử dụng biến Last để cho biết địa chỉ của ký tự cuối cùng của chuỗi. Gọi: n- số chuỗi con ai-địa chỉ của ký tự đầu tiên của chuỗi con thứ i bi- địa chỉ của ký tự cuối cùng của chuỗi con thứ i Ta có : ai = pointer[i] bi = pointer[i+1]-1 , nếu i = pointer[i-1] ,nếu i>1 bi = pointer[i]$2.Các giải thuật tìm kiếm trên chuỗiBài toán: Tìm kiếm chuỗi p có chiều dài là m trong chuỗi a có chiều dài n.Có hai trường hợp xảy ra sau khi tìm kiếm đó là: - Nếu không tìm thấy chuỗi p trong chuỗi a thì kết quả là 0. - Nếu tìm thấy chuỗi p trong chuỗi a thì kết quả là vị trí của ký tự đầu tiêncủa lần tìm thấy đầu tiên. Sau đây chúng ta lần lượt đi vào phân tích từng giải thuật cụ thể :2.1. Giải thuật Brute- Force.a. Nội dung của giải thuật- Đ ối với vị trí kí tự thứ i của chuỗi a (i=1,2,…,n-m+1) ta so sánh các ký tựtương ứng từ trái qua phải: p[1] với a[i] p[2] với a[i+1] …………. p[m] với a[i+m+1]- Gọi: i - chỉ số của chuỗi a. j - chỉ số của chuỗi p. Nếu a[i] = p[j] thì ta tăng chỉ số i và j lên 1(xét đến ký tự tiếp theo) Nếu a[i]p[j] thì ta cho j chỉ về đầu chuỗi p (j=1) và i chỉ về vị trí ký tựkế tiếp khi bắt đầu tìm kiếm lần cuối cùng (i = i-j+2). Giải thuật kết thúc khi j>m hoặc i>n.- Ta khai báo : Type St =string[255]; 3 Vâ Minh Phæ – Bæ m«n Khoa häc m¸y tÝnh Index = 1..255;c. Giải thuật:Chương trình thực hiện giải thuật này như sau:program Brute_Force;uses crt;type st=string[50];var a,p:st; {a chứa chuỗi nguồn , p là chuỗi đích, n độ dài chuỗi a ,m là độ dài chuỗip}procedure init;var i,j:integer;begin writeln(Nhập chuỗi a:); readln(a); writeln(Nhập chuỗi p:); readln(p);end;procedure Result;begin writeln(Chuỗi cần tìm là:,p)end;Function Brutesearch(p,a:st):integer;var i,j,m,n:integer;begin m:=length(p); n:=length(a); i:=1; j:=1; repeat if a[i]=p[j] then begin i:=i+1; j:=j+1; 4 Vâ Minh Phæ – Bæ m«n Khoa häc m¸y tÝnh end else begin i:=i-j+2; j:=1; ...
Nội dung trích xuất từ tài liệu:
CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖI CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖIChuỗi (string) là một loại dữ liệu cơ bản thường được sử dụng trong rất nhiềucác hệ thống và là thành phần cơ bản trong các hệ thống xử lý văn bản (word -processing-system), các hệ thống này cung cấp cho ta rất nhiều khả năng đ ể xửlý văn bản. Ngoài ra một vài các hệ thống đồ hoạ trên máy tính (computergraphics system) biểu diễn các hình ảnh như là các chuỗi nhị phân.Các thao tác trên chuỗi chúng ta thường gặp một số các phép toán cơ b ản như: - Phép tìm kiếm một chuỗi con trong một chuỗi. - Phép thay thế một chuỗi con của một chuỗi bởi một chuỗi khác. - Phép chen chuỗi con vào một chuỗi. - Phép loại bỏ một chuỗi con của một chuỗi.Trong các phép toán nêu trên thì phép tìm kiếm trên chuỗi là phép toán quantrọng và thường gặp , vì vậy ta chỉ tìm hiểu các giải thuật liên quan đến phéptoán này đó là : 1. G iải thuật Brute-Force. 2. G iải thuật Knuth-Morris-Pratt. 3. G iải thuật Boyer-Moore.$1. Các khái niện cơ bản về chuỗi1.1. Chuỗi và phân chia chuỗia. Đ ịnh nghĩa chuỗiChuỗi là một dãy các ký tự được chứa trong một vùng liên tục của bộ nhớ. Cácký tự này có thể là ký tự chữ, ký tự số hoặc ký tự đặc biệt.Chuỗi ký tự (text string) có thể được xem như là dãy các chữ, các số và các kýtự đặc biệt.Một loại chuỗi khác là chuỗi nhị phân (binary string), đó là một dãy các kí tự 0và 1. 1 Vâ Minh Phæ – Bæ m«n Khoa häc m¸y tÝnhb. Đ ộ dài chuỗi. Số ký tự của chuỗi được gọi là chiều dài của chuỗi. Mỗi ký tựchiếm 1 byte.Một chuỗi có thể có chiều dài bằng 0 gọi là chuỗi rỗng(null string ), ký hiệu là “Một chuỗi có thể đ ược chia làm nhiều phần, mỗi phần là một chuỗi con (substring ). Các chuỗi con có thể có chiều dài bằng nhau hoặc khác nhau.1.2. Cách phân chia chuỗia. Dùng ký tự đặc biệt. Dùng ký tự trống ( blank) để phân chia chuỗi con. Khi đócác chuỗi con có thể khác nhau. Để truy xuất một chuỗi con trong chuỗi thì taphải tìm kiếm từ đầu chuỗi. Do đó tốc độ truy xuất của phương pháp này chậm.b. Dùng chiều dài cố định. Ta chia các chuỗi con thành các phần bằng nhau. Đểtruy xuất một chuỗi con trong một chuỗi thì ta dùng công thức tính địa chỉ. Dođó tốc độ truy xuất của phương pháp này rất nhanh.c. Dùng chỉ điểm (pointer). - D ùng chỉ điểm đầu: Chỉ điểm đầu chỉ vào ký tự đầu tiên của chuỗi con. Ta sử dụng biến Last để cho biết địa chỉ của ký tự cuối cùng của chuỗi. Gọi: n- số chuỗi con ai-địa chỉ của ký tự đầu tiên của chuỗi con thứ i bi- địa chỉ của ký tự cuối cùng của chuỗi con thứ i Ta có : ai = pointer[i] bi = pointer[i+1]-1 , nếu i = pointer[i-1] ,nếu i>1 bi = pointer[i]$2.Các giải thuật tìm kiếm trên chuỗiBài toán: Tìm kiếm chuỗi p có chiều dài là m trong chuỗi a có chiều dài n.Có hai trường hợp xảy ra sau khi tìm kiếm đó là: - Nếu không tìm thấy chuỗi p trong chuỗi a thì kết quả là 0. - Nếu tìm thấy chuỗi p trong chuỗi a thì kết quả là vị trí của ký tự đầu tiêncủa lần tìm thấy đầu tiên. Sau đây chúng ta lần lượt đi vào phân tích từng giải thuật cụ thể :2.1. Giải thuật Brute- Force.a. Nội dung của giải thuật- Đ ối với vị trí kí tự thứ i của chuỗi a (i=1,2,…,n-m+1) ta so sánh các ký tựtương ứng từ trái qua phải: p[1] với a[i] p[2] với a[i+1] …………. p[m] với a[i+m+1]- Gọi: i - chỉ số của chuỗi a. j - chỉ số của chuỗi p. Nếu a[i] = p[j] thì ta tăng chỉ số i và j lên 1(xét đến ký tự tiếp theo) Nếu a[i]p[j] thì ta cho j chỉ về đầu chuỗi p (j=1) và i chỉ về vị trí ký tựkế tiếp khi bắt đầu tìm kiếm lần cuối cùng (i = i-j+2). Giải thuật kết thúc khi j>m hoặc i>n.- Ta khai báo : Type St =string[255]; 3 Vâ Minh Phæ – Bæ m«n Khoa häc m¸y tÝnh Index = 1..255;c. Giải thuật:Chương trình thực hiện giải thuật này như sau:program Brute_Force;uses crt;type st=string[50];var a,p:st; {a chứa chuỗi nguồn , p là chuỗi đích, n độ dài chuỗi a ,m là độ dài chuỗip}procedure init;var i,j:integer;begin writeln(Nhập chuỗi a:); readln(a); writeln(Nhập chuỗi p:); readln(p);end;procedure Result;begin writeln(Chuỗi cần tìm là:,p)end;Function Brutesearch(p,a:st):integer;var i,j,m,n:integer;begin m:=length(p); n:=length(a); i:=1; j:=1; repeat if a[i]=p[j] then begin i:=i+1; j:=j+1; 4 Vâ Minh Phæ – Bæ m«n Khoa häc m¸y tÝnh end else begin i:=i-j+2; j:=1; ...
Tìm kiếm theo từ khóa liên quan:
thuật toán tài liệu thuật toán chuỗi suy diễn tài liệu lập trình kỹ thuật lap trìnhGợi ý tài liệu liên quan:
-
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 247 0 0 -
NGÂN HÀNG CÂU HỎI TRẮC NGHIỆM THIẾT KẾ WEB
8 trang 188 0 0 -
Giới thiệu môn học Ngôn ngữ lập trình C++
5 trang 181 0 0 -
Bài giảng Nhập môn về lập trình - Chương 1: Giới thiệu về máy tính và lập trình
30 trang 147 0 0 -
Luận văn: Nghiên cứu kỹ thuật giấu tin trong ảnh Gif
33 trang 147 0 0 -
Bài giảng lập trình c căn bản - Trường Apptech - Chương 4
27 trang 117 0 0 -
Giáo trình Lập trình C căn bản - HanoiAptech Computer Education Center
136 trang 117 0 0 -
Báo cáo thực tập Công nghệ thông tin: Lập trình game trên Unity
27 trang 115 0 0 -
Giáo trình về phân tích thiết kế hệ thống thông tin
113 trang 113 0 0 -
LUẬN VĂN: Tìm hiểu kỹ thuật tạo bóng cứng trong đồ họa 3D
41 trang 104 0 0