1. Trang chủ
  2. » Công Nghệ Thông Tin

CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖI docx

44 246 1
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Chuỗi và Các Bài Toán Trên Chuỗi
Tác giả Võ Minh Phổ
Người hướng dẫn Bổ Môn Khoa Học Máy Tính
Trường học Trường Đại Học Công Nghệ Thông Tin
Chuyên ngành Khoa Học Máy Tính
Thể loại Bài Tập
Năm xuất bản 2023
Thành phố Thành Phố Hồ Chí Minh
Định dạng
Số trang 44
Dung lượng 353,82 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖI Chuỗi string là một loại dữ liệu cơ bản thường được sử dụng trong rất nhiều cá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-pr

Trang 1

CHUỖI VÀ CÁC BÀI TOÁN TRÊN CHUỖI

Chuỗi (string) là một loại dữ liệu cơ bản thường được sử dụng trong rất nhiều cá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 (computer graphics 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 quan trọ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ép toán này đó là :

1 Giải thuật Brute-Force

2 Giải thuật Knuth-Morris-Pratt

3 Giải thuật Boyer-Moore

$1 Các khái niện cơ bản về chuỗi

1.1 Chuỗi và phân chia chuỗi

a Định nghĩa chuỗi

Chuỗ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ác

ký 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ự 0

và 1

Trang 2

b Độ 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 (sub string ) 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ỗi

a 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ì ta phả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<n

= last , nếu i=n

- Dùng chỉ điểm cuối : Chỉ điểm cuối chỉ vào ký tự cuối cùng của chuỗi

con Ta sử dụng biến First để cho biết địa chỉ của ký tự đầu tiên củachuỗi

Ta có :

ai = First , nếu i=1

Trang 3

= pointer[i-1] ,nếu i>1

bi = pointer[i]

$2.Các giải thuật tìm kiếm trên chuỗi

Bà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ên củ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:

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];

Trang 5

Cho chuỗi a=’ 0101101001110011101011100’ n=27, chuỗi p=’ 010011’ m=6

stt So sánh 2 giá trị Chí số mới của i và j Chú thích

Trang 6

d Phân tích giải thuật

Trường hợp xấu nhất của giải thuật này là trường hợp cả hai chuỗi p và a đều gồm các số 0 và kết thúc là số 1 Khi đó với n-m +1 lần tìm kiếm ta phải so sánh

m ký tự của chuỗi p với các ký tự tương ứng của chuỗi a

Số lần so sánh :

Cmax=m*(n-m+1)

Ta có thể cải tiến giải thuật này bằng giải thuật Knuth- Morris-Pratt

2.2 Giải thuật Knuth- Morris- Pratt

a Nội dung của giải thuật

- Trong giải thuật Brute-Force ta nhận thấy khi so sánh đến ký tự p[j]<>a[i] thì

ta đã có j -1 kí tự đầu tiên của chuỗi p bằng với các j-1 ký tự cuối cùng trước a[i] của chuỗi a

Ví dụ :

Trang 7

chuỗi a là :’1010100111’

chuỗi p là :’10100111‘

- Ta nhận thấy a[5] và p[5] khỏc nhau Khi đú ta khụng cần cho j=1 nữa mà cho

j về 3 để so sỏnh vỡ ta nhận thấy 3 ký tự đầu tiờn của chuỗi p bằng với 3 ký tự đang xột cuối cựng của của chuỗi a Do đú ta khụng cần cho i quay về vị trớ trước nữa mà vẫn tiếp tục cho i tăng Ta sử dụng mảng next[1…m] để để ghi nhận giỏ trị j quay về Phần tử next[j] sẽ cho giỏ trị mới của j khi phỏt hiện hai

ký tự khỏc nhau Mảng next[1…m] được xỏc định như sau :

- Sử dụng chuỗi p1 hoàn toàn giống p

Cho chuỗi p1 di chuyển từ trỏi qua phải đồng thời so sỏnh với chuỗi p và dừng lại khi cỏc kớ tự đầu tiờn của chuỗi p1 trựng với cỏc kớ tự của chuỗi p Cỏc kớ tự trựng này sẽ xỏc định giỏ trị của next

- Nếu sự khỏc nhau này được phỏt hiện ở p[j] thỡ next[j] :=1+số ký tự trựng nhau +.với j=1 next[j]=0

+.với j>1 next[j] := là số lớn nhất k<j sao cho k-1 ký tự đầu tiên của p1 trùng với k-1 ký tự cuối cùng của j-1 (tại thời điểm đang xét) ký tự đầu tiên của p

- Khi xác định next [j] việc di chuyên p1 qua phải dừng lại khi phát hiện các ký tự

đi trước của chuỗi p1 trùng với các ký tự của chuỗi p hoặc khi p1[1]=p[j]

- Khi xỏc định next[j] việc di chuyển chuỗi p1 qua phải sẽ dừng lại khi phỏt hiện cỏc kớ tự đi trước của chuỗi p1 bằng với cỏc kớ tự của chuỗi p hoặc khi p1[1] gặp p[j]

Trang 11

Số lần so sánh Cmax=n+m Ta thấy số lần so sánh đã giảm đi nhiều lần

2.3 Giải thuật Boyer –Moore

a Nội dung giải thuật:

- Giải thuật Boyer-Moore tương tự với giải thuật Knuth-Morris-Pratt Đối với giải thuật Boyer, ta xét chuỗi p1 từ phải qua trái trong khi ta so sánh chuỗi p với chuỗi a

Cách xây dựng mảng next của giải thuật Boyer-Moore là phần tử next[j] là số vị trí kí tự mà chuỗi p sẽ di chuyển qua phải đối với chuỗi p1 để có được vị trí khác nhau ở kí tự thứ j kể từ phải qua trái của chuỗi p

b Giải thuật:

Để xác định vị trí mới của j khi có sự so sánh trùng nhau ta dùng mảng skip Hàm Function Ord(c:char):integer trả về số thứ tự của ký tự c trong bộ ký tự (đánh số từ 1)

Khi đó skip[c]=m nếu c không phải là một ký tự của chuỗi p

skip[c]=m-j nếu c là kí tự thứ j của chuỗi p

Trang 13

type m= array [1 9] of string;

const menu:m=(' 1 Dao nguoc xau ',' 2 Tinh chieu dai cua xau',' 3 Chi so cua xau',' 4 Lay xau ky tu con',

' 5 In xau khong de quy',' 6 In xau de quy',' 7 Bai 5.2',' 8 Bai 5.5',' 9 Thoat');

Trang 15

function themdau(var first:ref;NewInfo:Infor):ref;

Trang 21

procedure inxau(first:ref); {khong de quy}

Trang 23

if stack.index=0 then pops:=false

Trang 28

function Polish(s:string; var p:string) :boolean;

Trang 31

Function expl(a,b:real;Var c:real):boolean;

for i:=1 to length(s) do

if s[i] in ['A' 'Z'] then

a[s[i]].exist:=true;

Trang 41

while first<>nil do xoacuoi(first);

Trang 42

write('Nhap vao so nguyen duong de chuyen doi :');

write('Bieu dien co so hai:');

while not Emptys(Stack1) do

Ngày đăng: 27/06/2014, 02:20

TỪ KHÓA LIÊN QUAN

w