Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 48 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
48
Dung lượng
1,02 MB
Nội dung
BÀI TIỂU LUẬN Đề tài : Nhà nước cần tạo điều kiện gì giúp cho doanh nghiệp Việt Nam tăng khả năng cạnh tranh trong quá trình hội nhập 1 M ục lục Chương 1: TỔNG QUANVỀCẤUTRÚCDỮLIỆU 3 1.1. Khái niệm vềcấutrúcdữliệu 3 1.2. Các cấutrúcdữliệu căn bản 3 1.2.1. Các kiểu dữliệu căn bản 3 1.2.2. Các kiểu dữliệu có cấutrúc 4 * Các thủ tục và hàm trên xâu ký tự 6 - Hàm lấy chiều dài của xây ký tự 6 1.3. Thuật toán và đánh giá độ phức tạp thuật toán 8 1.3.1. Thuật toán 8 Chương 2: DANH SÁCH 14 2.1. Định nghĩa danh sách 14 2.2. Danh sách đặc 14 2.2.3. Các phép toán trên danh sách: 14 2.3. Danh sách liên kết, các phép toán 16 2.3.1. Định nghĩa 16 2 Chương 1: TỔNGQUANVỀCẤUTRÚCDỮLIỆU o0o 1.1. Khái niệm vềcấutrúcdữ liệu. Cấutrúcdữliệu (CTDL) là một cách tổ chức dữliệu của bài toán. CTDL có thể do ngôn ngữ lập trình định nghĩa trước hoặc có thể do người sử dụng định nghĩa. Cấutrúcdữliệu tốt thì thuật toán xử lý bài toán mới tối ưu. Chính vì vậy, Niklaus wirth đã tổng kết: “Cấu trúcdữliệu + thuật toán = Chương trình”. Cách biểu diễn tối ưu một cấutrúcdữliệu trong bộ nhớ được gọi là cấutrúc lưu trữ (storage structure). Có thể có nhiều cấutrúc lưu trữ cho cùng một cấutrúcdữ liệu. Cấutrúcdữliệu tương ứng với bộ nhớ gọi là lưu trữ trong hay tương ứng với bộ nhớ ngoài gọi là lưu trữ ngoài. Thông thường một kiểu dữliệu được định nghĩa như sau: Một kiểu dữliệu T là một cặp T = <V,O> trong đó: - V (value) : Là một tập các trị mà một biến có kiểu T nhận được. - O (Operator) : Là tập hợp các thao tác trên V. Ví dụ: a. T ≡ Integer = <V,O> V={-32768, ,32767} ; O={+,-,*,/,mod,div,xor,<,>, } b. T ≡ Boolean = <V,O> V={True, False}; O = { And, Or, Xor, Not, <, >, =,…} Một cấutrúcdữliệu là một kiểu dữliệu được xây dựng từ những kiểu dữliệu đã biết, trong trường hợp này cho ta một CTDL tương ứng với một kiểu dữliệu đã cho. 1.2. Các cấutrúcdữliệu căn bản. 1.2.1. Các kiểu dữliệu căn bản. - Kiểu Integer (nguyên – 2 byte, -32768 32767). Gồm tập hợp con các số nguyên. Tất cả các phép toán trên dữliệu integer đều tuân thủ các qui tắc số học. Các toán tử chuẩn gồm bốn phép toán số học cơ bản: cộng (+), trừ (-), nhân (*), chia nguyên (div). - Kiểu Real (thực – 6 byte,2.9E-39 1.7E38). Gồm tập hợp con của các số thực, các toán tử chuẩn gồm bốn phép toán số học cơ bản là: công (+), trừ (-), nhân (/). - Kiểu Boolean (luận lý – 1 bit). Gồm hai giá trị luân lý true (đúng) và false (sai). Các toán tử luận lý gồm ba phép toán cơ bản: not (phủ định), and (và) và or (hay). Các phép toán so sánh cho kết quả là một giá trị luận lý. Các phép toán so sánh gồm: = bằng <> khác bằng (khác) < nhỏ hơn <= nhỏ hơn hoặc bằng > lớn hơn 3 >= lớn hơn hoặc bằng - Kiểu char ( kí tự – 1 byte): Gồm tập hợp các kí tự in được. Các kí tự thường dùng là: + Kiểu char gồm 26 chữ Latin ((‘A’<=x) and (x<=’Z’)), 10 ký số( 0 9) và một số ký tự đặc biệt, ký tự trắng. - Kiểu liệt kê (Enuerated Types) Kiểu liệt kê gồm một tập hợp các giá trị bằng cách liệt kê các danh hiệu (identifier) chỉ định các giá trị này. Thứ tự của các kiểu liệt kê được định nghĩa như sau: Type T = (c 1 ,c 2 ,…, c n ) trong đó c 1 ,c 2 ,…, c n là các danh hiệu chỉ định các giá trị của kiểu liệt kê. Ví dụ: Type shape = (rectange, square, ellipse, circle) - Kiểu miền con (Subrange Types) là trường hợp một biến có giá trị chỉ nằm trong một khoảng xác định nào đó của một kiểu. Điều này có thể được biểu diễn bằng cách định nghĩa biến thuộc kiểu miền con theo dạng: Type T= min … max - Kiểu chuỗi (string). Gồm một tập hợp các kí tự. Các chuỗi kí tự này được ghi trong hai dấu nháy đơn (‘) và có tối đa 255 ký tự. Số ký tự của chuỗi được gọi là chiều dài của chuỗi, được khai báo như sau: Var s : string[10] ; 1.2.2. Các kiểu dữliệu có cấu trúc. a. Kiểu mảng. Mảng là một bảng chứa dữliệu có cùng kiểu, trên các hàng cột, giá trị của dữliệu được xác định theo chỉ số hàng, cột. Có hai loại mảng: Một chiều, hai chiều. Bao gồm có tên của mảng và chỉ số tương ứng Ví dụ: Mảng một chiều a(n) với n là số nguyên nào đó, cho xác định số phần tử của mảng, phần tử của mảng được xác định theo chỉ số, chẳng hạn phần tử thứ 3 của mảng a ta ghi a[3] (dấu ngoặc vuông). Mảng hai chiều a(n,m) thường có nxm phần tử, gồm có n hàng, m cột, một phần tử thứ i,j nào đó có nghĩa là phần tử ở hàng thứ i, cột thứ j. * Mảng một chiều. - Cú pháp: + Khai báo gián tiếp: Kiểu TYPE <mảng> = Array[ Chỉ số] OF <Kiểu dữ liệu>; VAR <Biến mảng>:<Kiểu mảng>; + Khai báo trực tiếp: VAR <Biến mảng> : ARRAY [chỉ số] OF <Kiểu dữ liệu>; Chú ý: Chỉ số trong khai báo đối với Pascal phải được xác định trước ở khai báo hằng hoặc ghi cụ thể. * Mảng hai chiều. 4 - Cú pháp: + Khai báo gián tiếp: TYPE <Kiểu mảng> = ARRAY [chỉ số1, chỉ số 2] OF <Kiểu dữ liệu>; VAR <Biến mảng>:<Kiểu mảng>; + Khai báo trực tiếp: VAR <Biến mảng> : ARRAY [chỉ số1, chỉ số 2] OF <Kiểu dữ liệu>; Ví dụ: TYPE Mangnguyen = Array[1 100] of Integer; Matrix = Array[1 10,1 10] of Integer; MangKytu = Array[Byte] of Char; VAR A: Mangnguyen; M: Matrix; C: MangKytu; Hoặc: VAR A: Array[1 100] of Integer; C: Array[Byte] of Char; b. Kiểu xâu ký tự. Chúng ta gọi kiểu dữliệu có giá trị là tập những kí tự là kiểu xâu kí tự hay nói một cách ngắn gọn là kiểu xâu. Pascal có từ khoá STRING để người dùng khai báo cho dữliệu có giá trị là tập những kí tự. Ví dụ ta khai báo biến A có kiểu là tập những kí tự như sau: VAR A : STRING ; máy dành cho biến A có thể lưu giữ được một tập có không quá 255 kí tự. Hằng văn bản phải để trong cặp dấu nháy cao (‘). * Khai báo. TYPETênKiểu = STRING[Max]; VAR Tên biến : TênKiểu; hoặc khai báo biến trực tiếp: VAR Tên biến : STRING[Max]; Trong đó Max là số ký tự tối đa có thể chứa trong chuỗi (Max ∈ [0,255]). Nếu không có khai báo [Max] thì số ký tự mặ mặc định trong chuỗi là 255. Ví dụ: Type Hoten = String[30]; St80 = String[80]; Var Name : Hoten; Line : St80; St : String; {St có tối đa là 255 ký tự} * Truy xuất phần tử. 5 - Có thể sử dụng các thủ tục xuất nhập Write, Writeln, Readln để truy xuất các biến kiểu String. - Để truy xuất đến ký tự thứ k của xâu ký tự, ta sử dụng cú pháp sau: Tênbiến[k]. * Các thủ tục và hàm trên xâu ký tự - Hàm lấy chiều dài của xây ký tự LENGTH(St : String):Integer; - Hàm COPY(St : String; Pos, Num: Byte): String; Lấy ra một xâu con từ trong xâu St có độ dài Num ký tự bắt đầu từ vị trí Pos . - Hàm POS(SubSt, St :String):Byte; Kiểm tra xâu con SubSt có nằm trong xâu St hay không? Nếu xâu SubSt nằm trong xâu St thì hàm trả về vị trí đầu tiên của xâu con SubSt trong xâu St, ngược lại hàm trả về giá trị 0. - Thủ tục DELETE(Var St:String; Pos, Num: Byte); Xoá trong xâu St Num ký tự bắt đầu từ vị trí Pos. - Thủ tục INSERT(SubSt: String; Var St: String; Pos: Byte); Chèn xâu SubSt vào xâu St bắt đầu tại vị trí Pos. - Thủ tục STR(Num; Var St:String); Đổi số nguyên hay thực Num thành dạng xâu ký tự, kết quả lưu vào biến St. - Thủ tục VAL(St:String; Var Num; Var Code:Integer); Đổi xâu số St thành số và gán kết quả lưu vào biến Num. Nếu việc chuyển đổi thành công thì biến Code có giá trị là 0, ngược lại biến Code có giá trị khác 0 (vị trí của lỗi). c. Kiểu bản ghi. Như ta đã biết các kiểu dữliệu đã có, mỗi biến thuộc một loại kiểu nào đó thì giá trị của chúng chỉ thuộc một kiểu đó: Chẳng hạn kiểu số nguyên, kiểu mảng…Trong khi đó kiểu bản ghi có thể coi như sự mở rộng các khái niệm biến và mảng, nó cho phép lưu trữ và xử lý các dạng thông tin phức tạp hơn. RECORD là một tập hợp các biến, các mảng và được hiển thị bằng một tên duy nhất. * Khai báo. TYPETênKiểu = RECORD Field1 : Kiểu1; Field2 : Kiểu2; FieldN: KiểuN; END; VAR Biến : TênKiểu; Ví dụ: 6 TYPE HocSinh = Record Hoten : String[20]; Tuoi : Integer; DiemTB : real; End; VAR HS : HocSinh; 1.2.3. Kiểu con trỏ. * Khai báo Type <Tên kiểu con trỏ> = ^ <Kiểu của biến động>; Var <Tên biến>:<Tên kiểu con trỏ>; Ví dụ 1: Type TroNguyen = ^integer; Var p, q: TroNguyen; Sau khai báo này các biến p và q là các biến con trỏ có thể trỏ đến các biến động có kiểu integer. Chương trình sẽ cấp phát 4 byte cho mỗi biến con trỏ. Còn vùng nhớ của các biến động chưa được cấp phát. Ví dụ 2: Type TroSv = ^ Sinhvien; Sinhvien = Record Hoten: String[20]; Diem: real; Tiep: TroSv; End; Var p: TroSv; Trong ví dụ này, p là biến trỏ có thể trỏ đến các bản ghi có kiểu Sinhvien, trong bản ghi này lại có trường Tiep là một biến trỏ có thể trỏ đến biến động khác cũng có kiểu Sinhvien. * Làm việc với biến động - Cấp phát vùng nhớ Dùng thủ tục New theo cú pháp: New(<biến trỏ>); - Giải phóng vùng nhớ Dùng thủ tục Dispose(p); 7 Trong đó p là một biến con trỏ. Thủ tục Dispose cho phép trả lại bộ nhớ động đã được cấp phát bởi thủ tục New. 1.3. Thuật toán và đánh giá độ phức tạp thuật toán . 1.3.1. Thuật toán. a. Khái niệm thuật toán (hay Giải thuật). Thuật toán hay giải thuật là một hệ thống chặc chẽ và rõ ràng các quy tắc nhằm xác định một dãy các thao tác trên những đối tượng, sao cho sau một số hữu hạn bước thực hiện các thao tác thì cho kết quả. b. Các đặc trưng của giải thuật. * Tính xác định Giải thuật bao gồm các bước rõ ràng. Trong cùng một điều kiện thì kết quả của mỗi bước là xác định. * Tính hữu hạn dừng Giải thuật sau một số hữu hạn bước thì cho kết quả. * Tính đúng đắn. Sau khi thực hiện các bước của giải thuật phải cho được kết quả mong muốn, kết quả đó được xác định theo định nghĩa có trước. * Tính phổ dụng Giải thuật phải giải quyết được cho một lớp bài toán. * Tính có đại lượng vào và ra Bắt đầu một giải thuật là việc nhận dữliệu vào (Input) – kết thúc giải thuật là một số kết quả (dữ liệu ra Output). * Tính hiệu quả. Tính hiệu quả của một giải thuật được đánh giá dựa trên các tiêu chuẩn sau: - Dung lượng bộ cần thiết - Số lượng phép tính cần thực hiện. - Thời gian cần thiết để chạy. - Dễ hiểu và dễ cài đặt. c. Biểu diễn thuật toán Thường có hai cách biểu diễn một thuật toán, cách thứ nhất là mô tả các bước thực hiện của thuật toán, cách thứ hai là sử dụng sơ đồ giải thuật. - Mô tả các bước thực hiện. Để biểu diễn thuật toán người ta mô tả chính xác các bước thực hiện của thuật toán, ngôn ngữ dùng để mô tả thuật toán có thể là ngôn ngữ tự nhiên hoặc một ngôn ngữ lai ghép giữa ngôn ngữ tự nhiên với một ngôn ngữ lập trình nào đó gọi là các đoạn giả mã lệnh. Ví dụ 1: mô tả thuật toán tìm ước số chung lớn nhất của hai số nguyên. Input: Hai số nguyên a, b. 8 Output: Ước số chung lớn nhất của a, b. Thuật toán: Bước 1: Nếu a=b th́ USCLN(a, b)=a. Bước 2: Nếu a > b th́ t́m USCLN của a-b và b, quay lại bước 1; Bước 3: Nếu a < b th́ t́m USCLN của a và b-a, quay lại bước 1; Ví dụ 2: Để giải phương trình bậc hai ax 2 + bx +c = 0, ta có thể mô tả thuật toán bằng ngôn ngữ liệt kê như sau: Bước 1: Xác định các hệ số a,b,c. Bước 2 :Kiểm tra xem các hệ số a,b,c có khác 0 hay không ? Nếu a=0 quay lại thực hiện bước 1. Bước 3: Tính biểu thức = b 2 – 4*a*c. Bước 4:Nếu ∆ <0 thông báo phương trình vô nghiệm và chuyển sang bước 8. Bước 5:Nếu ∆=0,tính x 1 =x 2 = a b *2 − và chuyển sang bước 7. Bước 6: Tính x 1 = a b *2 ∆−− , x 2 = a b *2 ∆+− và chuyển sang bước 7. Bước 7: Thông báo các nghiệm x 1 , x 2 . Bước 8: Kết thúc thuật toán. - Sử dụng lưu đồ giải thuật. Sử dụng các kư hiệu h́nh khối cơ bản để tạo thành một mô tả mang tính h́nh thức (cách này rơ ràng hơn so với việc mô tả các bước thực hiện thuật toán). Khối 1: Khối bắt đầu thuật toán, chỉ có duy nhất một đường ra. Khối 2: Khối kết thúc thuật toán, có thể có nhiều đường vào. Khối 3: Thực hiện câu lệnh (có thể là một hoặc nhiều câu lệnh); gồm một đường vào và Nhập, Xuất Bắt đầu Kết thúc Câu lệnh Điều kiện 1 2 3 4 5 Đúng Sai 9 một đường ra. Khối 4: Rẽ nhánh, kiểm tra biểu thức điều kiện (biểu thức Boolean), nếu biểu thức đúng thuật toán sẽ đi theo nhánh Đúng (True), nếu biểu thức sai thuật toán sẽ đi theo nhánh Sai (False). Khối 5: Các câu lệnh nhập và xuất dữ liệu. d. Phân tích thời gian thực hiện giải thuật. Một giải thuật cho một lời giải thỏa đáng đối với một bài toán phải thỏa: - Đúng. - Hiệu quả. Thước đo về tính hiệu quả thường là thời gian mà máy sử dụng để giải quyết bài toán, khi các giá trị đầu vào có một kích thước xác định. Thước đo thứ hai là dung lượng bộ nhớ đòi hỏi để thực hiện giải thuật ứng với giá trị đầu vào có kích thước xác định. Sự phân tích thời gian cần thiết để giải một bài toán có kích thước nào đó, liên quan đến độ phức tạp thời gian của giải thuật. Sự phân tích bộ nhớ cần thiết của máy tính liên quan đến độ phức tạp không gian của giải thuật. Sự xem xét độ phức tạp không gian gắn với cấutrúcdữliệu được dùng để thực hiện giải thuật. Trong phần này ta xét đến độ phức tạp thời gian. Độ phức tạp thời gian là một hàm tỷ lệ với kích thước dữ liệu, ký hiệu là T(n), trong đó n là kích thước dữliệu vào. Tuy nhiên T(n) không thể biểu diễn thành đơn vị thời gian là giây, phút…(do các máy tính có cấu hình khác nhau, hệ thống khác nhau…). Mặc dù vậy, chúng ta hoàn toàn có thể so sánh được dựa vào các giá trị của hàm. Ví dụ: Giải thuật 1: - Độ phức tạp thời gian T 1 (n) = an 2 Giải thuật : - Độ phức tạp thời gian T 2 (n) = kn Khi n lớn rõ ràng là T 1 (n) >=T 2 (n). Vậy giải thuật 1 chậm hơn giải thuật 2. 1.3.2. Đánh giá độ phức tạp của giải thuật. Giả sử ta có hai giải thuật P1 và P2 với thời gian thực hiện tương ứng là T1(n) = 100n 2 (với tỷ suất tăng là n 2 ) và T2(n) = 5n 3 (với tỷ suất tăng là n 3 ). Giải thuật nào sẽ thực hiện nhanh hơn? Câu trả lời phụ thuộc vào kích thước dữliệu vào. Với n < 20 thì P2 sẽ nhanh hơn P1 (T2<T1), do hệ số của 5n 3 nhỏ hơn hệ số của 100n 2 (5<100). Nhưng khi n > 20 thì ngươc lại do số mũ của 100n 2 nhỏ hơn số mũ của 5n 3 (2<3). Ở đây chúng ta chỉ nên quan tâm đến trường hợp n>20 vì khi n<20 thì thời gian thực hiện của cả P1 và P2 đều không lớn và sự khác biệt giữa T1 và T2 là không đáng kể. Như vậy một cách hợp lý là ta xét tỷ suất tăng của hàm thời gian thực hiện chương trình thay vì xét chính bản thân thời gian thực hiện. Cho một hàm T(n), T(n) gọi là có độ phức tạp f(n) nếu tồn tại các hằng C, N 0 sao cho T(n) ≤ Cf(n) với mọi n ≥ N 0 (tức là T(n) có tỷ suất tăng là f(n)) và kí hiệu T(n) là O(f(n)) (đọc là “ô của f(n)”) Ví dụ 1: T(n)= (n+1) 2 có tỷ suất tăng là n 2 nên T(n)= (n+1) 2 là O(n 2 ) Chú ý: O(C.f(n))=O(f(n)) với C là hằng số. Ðặc biệt O(C)=O(1) 10 [...]... mối quan hệ tương đối: Nếu biết phần tử a i thì sẽ định được vị trí phần tử ai+1 Nói cách khác hơn, các phần tử thuộc một danh sách có thể sắp xếp tuyến tính Ví dụ 1: - Danh sách sinh viên là một danh sách - Kiểu dữliệu mảng trong pascal là một danh sách 2.2 Danh sách đặc 2.2.1 Định nghĩa Danh sách đặc là một danh sách mà các phần tử được sắp xếp kế tiếp nhau trong bộ nhớ 2.2.2 Tổ chức cấu trúcdữ liệu. .. mà các phần tử được nối kết nhau nhờ vào vùng liên kết của chúng Danh sách liên kết là một loại cấutrúc đơn giản và thích hợp với các phép thêm vào, phép loại bỏ, phép ghép nhiều danh sách mà các phép toán này lại không thích hợp cho danh sách đặc 2.3.2 Danh sách liên kết đơn 2.3.2.1 Tổ chức cấu trúcdữliệu Danh sách liên kết là danh sách mà mỗi phần tử của danh sách được lưu trữ trong một phần tử... sớm hơn Hàm Search trả về địa chỉ của phần tử tìm thấy đầu tiên hoặc trả về giá trị nil nếu không tìm thấy * Trường hợp danh sách chưa có thứ tự: Ta phải tìm kiếm khoá x bắt đầu từ phần tử đầu tiên cho đến khi tìm thấy khoá này trong danh sách hoặc cho đến khi hết danh sách nếu không tìm thấy Hàm Search trả về địa chỉ của phần tử đầu tiên có nội dung là x (tìm thấy) hoặc trả về giá trị nil (không tìm... cộng Như vậy thời gian này là thời gian thi hành một lệnh nào đó lâu nhất trong chuỗi lệnh - Thời gian thực hiện cấutrúc IF là thời gian lớn nhất thực hiện lệnh sau THEN hoặc sau ELSE và thời gian kiểm tra điều kiện Thường thời gian kiểm tra điều kiện là O(1) - Thời gian thực hiện vòng lặp là tổng (trên tất cả các lần lặp) thời gian thực hiện thân vòng lặp Nếu thời gian thực hiện thân vòng lặp không... sinh viên có kiểu dữliệu record như sau: Type Tro = ^sinhvien; sinhvien = record; mssv : integer; hoten : string[30] ; tenlop : string[8]; link : tro; end; Trong đó các vùng (field): mssv, hoten, tenlop là các vùng info và vùng link là vùng liên kết Ngoài ra, danh sách liên kết có thể có một phần tử đặc biệt (biến kiểu record) bao gồm nhiều vùng để ghi những thông tin cần thiết về danh sách như số... thời gian hay O(1), Lệnh đọc dữliệu READ(x) tốn một hằng thời gian hay O(1).Vậy thời gian thực hiện cả hai lệnh trên nối tiếp nhau là O(max(1,1))=O(1) * Quy tắc nhân : Nếu T1(n) và T2(n) là thời gian thực hiện của hai đoạn chương trình P1và P2 và T1(n) = O(f(n)), T2(n) = O(g(n)) thì thời gian thực hiện của đoạn hai đoạn chương trình đó lồng nhau là T(n) = O(f(n).g(n)) Qui tắc tổng quát để phân tích một... Tràn như đối với stack tổ chức bằng mảng, vì stack móc nối không hề bị giới hạn về kích thước, nó chỉ phụ thuộc vào giới hạn của bộ nhớ Stack là một danh sách liên kết được khai báo như sau: Type Tro = ^nut; Nut = record Info : element; Link : tro; End; Var Sp : Tro;{Sp trỏ đến đầu ngăn xếp} 2.4.1.3 Các thao tác a Dùng cấutrúc mảng để biểu diễn ngăn xếp - Khai báo stack Type Stack = array[1 n] of element;... nên ta chỉ cần tìm kiếm khoá x cho đến khi tìm thấy khoá này trong danh sách hoặc cho đến khi khoá của phần tử hiện tại luôn lớn hơn x nếu không tìm thấy Hàm Search trả về giá trị của phần tử đầu tiên có nội dung là x (tìm gặp) hoặc trả về giá trị nil (không tìm gặp) Thuật toán: Function Search (i: Element):tro; Var p:tro; Begin p:= First; while (p nil) and (p^.info . lục Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU 3 1.1. Khái niệm về cấu trúc dữ liệu 3 1.2. Các cấu trúc dữ liệu căn bản 3 1.2.1. Các kiểu dữ liệu căn bản 3 1.2.2. Các kiểu dữ liệu có cấu trúc 4 * Các. 16 2.3.1. Định nghĩa 16 2 Chương 1: TỔNG QUAN VỀ CẤU TRÚC DỮ LIỆU o0o 1.1. Khái niệm về cấu trúc dữ liệu. Cấu trúc dữ liệu (CTDL) là một cách tổ chức dữ liệu của bài toán. CTDL có thể do ngôn. =,…} Một cấu trúc dữ liệu là một kiểu dữ liệu được xây dựng từ những kiểu dữ liệu đã biết, trong trường hợp này cho ta một CTDL tương ứng với một kiểu dữ liệu đã cho. 1.2. Các cấu trúc dữ liệu căn