Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
139,44 KB
Nội dung
Câu 5: Trình bày vài ví dụ cho thấy lợi ích khi xử lý liệu xếp Ví dụ 1: Cho danh sách sinh viên lớp gồm có MSSV, Họ tên sv, Ngày sinh Lúc liệu chưa xếp thứ tự MSSV, thông tin sinh viên xếp loạn, sau xếp tìm kiếm thơng tin dễ Tìm theo thứ tự MSSV chữ đầu tên sinh viên Ví dụ 2: Cho bảng điểm thi sinh viên lớp Khi chưa xếp điểm thấp, cao nằm xen kẽ với Nên muốn tìm sinh viên có điểm cao nhất, thấp thời gian bị rối Khi xếp dễ dàng tìm sinh vên có điểm cao nhất, thấp xếp theo thứ tự điểm từ cao xuống thấp Câu 6: Sắp xếp gì? xếp ngồi gì? giải thuật xếp (đã học) phù hợp với xếp ngoài? Trả lời: Sắp xếp liệu phải xếp ln nhớ chính, ngụ ý truy cập nhanh Việc xếp hoàn chỉnh xảy nhớ Sắp xếp ngồi liệu nằm đĩa cứng, đĩa mềm, bên nhớ Đó liệu lớn lưu trữ nhớ Những giải thuật xếp phù hợp với xếp là: MergeSort, Sắp xếp theo số (RadixSort) Câu 7: Tìm kiếm nhị phân tìm kiếm khác nào? Trong điều kiện sử dụng tìm kiếm nhị phân? Trả lời: Tìm kiếm tuần tự: Trong kỹ thuật này, danh sách có thứ tự khơng có thứ tự tìm kiếm trình tự từ đầu phần tử mong muốn tìm thấy Nếu phần tử mong muốn tìm thấy danh sách việc tìm kiếm thành cơng khơng khơng thành cơng Tìm kiếm nhị phân: Thuật tốn tìm kiếm nhị phân sử dụng với danh sách phần tử xếp Quá trình tìm kiếm bắt đầu so sánh phần tử tìm kiếm với phần tử danh sách Nếu hai phù hợp, kết "phần tử tìm thấy" Sự khác biệt: độ phức tạp Tìm kiếm nhị phân có độ phức tạp thời gian chạy tốt nhiều so với tìm kiếm Về bản, tìm kiếm nhị phân nhanh nhiều so với tìm kiếm cho lượng lớn liệu Độ phức tạp: Tìm kiếm nhị phân O (log N), Tìm kiếm O (N) Trong điều kiện liệu, danh sách phải xếp từ trước sử dụng tìm kiếm nhị phân Câu 8: Mục đích việc tạo Index cho table ứng dụng sở liệu Trả lời: Index đối tượng lược đồ có chứa mục nhập cho giá trị xuất (các) cột lập mục table cụm cung cấp quyền truy cập trực tiếp, nhanh chóng vào hàng Các Index cho phép ứng dụng sở liệu tìm kiếm liệu nhanh chóng; mà khơng cần đọc tồn table Index sử dụng để tăng tốc độ tìm kiếm, truy vấn Câu 9: Cho mảng a gồm phần tử sau: 7,5,9,4,3,10,2 Trình bày thứ tự bước thực chạy giải thuật xếp sau: a) Inter Change Sort Cho mảng A gồm phần tử xếp ngẫu nhiên sau: 7, 5, 9, 4, 3, 10, Bước 1: i = 1; Bước 2: j = i + 1; // tìm phần tử a[j] < a[i], j > i Bước 3: Trong j ≤ n thực Nếu a[j] < a[i]: a[i] ↔ a[j]; j = j + 1; Bước 4: i = i + Nếu i < n: Lặp lại bước Ngược lại: Dừng Mảng a[ ] = {7, 5, 9, 4, 3, 10, 2.} So sánh: i = {7,5,9,4,3,10,2} => {5,7,9,4,3,10,2}, > nên đổi chỗ 7;5 {5,7,9,4,3,10,2} => {5,7,9,4,3,10,2}, < nên khơng đổi chỗ {5,7,9,4,3,10,2} => {4,7,9,5,3,10,2}, > nên đổi chỗ 5;4 {4,7,9,5,3,10,2} => {3,7,9,5,4,10,2}, > nên đổi chỗ 4;3 {3,7,9,5,4,10,2} => {3,7,9,5,4,10,2}, < 10 nên khơng đổi chỗ {3,7,9,5,4,10,2} => {2,7,9,5,4,10,3}, > nên đổi chỗ 3;2 Tiếp tục i = thực tương tự: => {2,3,9,7,5,10,4} Tiếp tục i = thực tương tự: => {2,3,4,9,7,10,5} Tiếp tục i = thực tương tự: => {2,3,4,5,9,10,7} ……… Cho tới i = thực tương tự: => {2,3,4,5,7,9,10} Kết a[7] = {2,3,4,5,7,9,10} b) Selection Sort Mảng a [7] = {7,5,9,4,3,10,2} Tìm phần tử nhỏ a [0 6] đặt đầu hoán đổi giá trị với phần tử đầu {2,5,9,4,3,10,7} Tìm phần tử nhỏ a [1 6] đặt đầu a [1 6] {2,3,9,4,5,10,7} Tìm phần tử nhỏ a [2 6] đặt đầu a [2 6] {2,3,4,9,5,10,7} Tìm phần tử nhỏ a [3 6] đặt đầu a [3 6] {2,3,4,5,9,10,7} Tìm phần tử nhỏ a [4 6] đặt đầu a [4 6] {2,3,4,5,7,10,9} Tìm phần tử nhỏ a [5 6] đặt đầu a [5 6] {2,3,4,5,7,9,10} Kết quả: a[7] = {2,3,4,5,7,9,10} c) Insertion Sort Mảng a[7] = {7,5,9,4,3,10,2} Dùng vòng lặp for i = đến i = 1: Vì < nên di chuyển chèn vào trước (i-1) {5,7,9,4,3,10,2} i = 2: vị trí tất phần tử a [0 … i-1] < {5,7,9,4,3,10,2} i = 3: di chuyển đầu tất phần tử 5,7,9 di chuyển lên vị trí so với vị trí chúng {4,5,7,9,3,10,2} i = 4: di chuyển đầu tất phần tử 4,5,7,9 di chuyển trước vị trí so với vị trí chúng {3,4,5,7,9,10,2} i = 5: 10 vị trí tất phần tử a [0 … i-1] < 10 {3,4,5,7,9,10,2} i = 6: di chuyển đầu tất phần tử 4,5,7,9,10 di chuyển trước vị trí so với vị trí chúng {2,3,4,5,7,9,10} Kết quả: a[7] = {2,3,4,5,7,9,10} d) Bubble Sort Mảng a[7] = {7,5,9,4,3,10,2} Lần lặp đầu tiên: {7,5,9,4,3,10,2} -> {5,7,9,4,3,10,2}, thuật toán so sánh phần tử đầu tiên, đổi chỗ cho > {5,7,9,4,3,10,2} -> {5,7,9,4,3,10,2}, hai phần tử xét thứ tự nên giữ nguyên < 9, không cần đổi chỗ {5,7,9,4,3,10,2} -> {5,7,4,9,3,10,2}, đổi chỗ > {5,7,4,9,3,10,2} -> {5,7,4,3,9,10,2}, đổi chỗ > {5,7,4,3,9,10,2} -> {5,7,4,3,9,10,2}, {5,7,4,3,9,10,2} -> {5,7,4,3,9,2,10}, đổi chỗ 10 > Lần lặp thứ 2: {5,7,4,3,9,2,10} -> {5,7,4,3,9,2,10}, {5,7,4,3,9,2,10} -> {5,4,7,3,9,2,10}, đổi chỗ > {5,4,7,3,9,2,10} -> {5,4,3,7,9,2,10}, đổi chỗ > {5,4,3,7,9,2,10} -> {5,4,3,7,9,2,10} {5,4,3,7,9,2,10} -> {5,4,3,7,2,9,10}, đổi chỗ > {5,4,3,7,2,9,10} -> {5,4,3,7,2,9,10} Lần lặp thứ 3: {5,4,3,7,2,9,10} -> {4,5,3,7,2,9,10}, đổi chỗ > {4,5,3,7,2,9,10} -> {4,3,5,7,2,9,10}, đổi chỗ > {4,3,5,7,2,9,10} -> {4,3,5,7,2,9,10} {4,3,5,7,2,9,10} -> {4,3,5,2,7,9,10}, đổi chỗ > {4,3,5,2,7,9,10} -> {4,3,5,2,7,9,10} {4,3,5,2,7,9,10} -> {4,3,5,2,7,9,10} Lần lặp thứ 4: {4,3,5,2,7,9,10} -> {3,4,5,2,7,9,10}, đổi chỗ > {3,4,5,2,7,9,10} -> {3,4,5,2,7,9,10} {3,4,5,2,7,9,10} -> {3,4,2,5,7,9,10}, đổi chỗ > {3,4,2,5,7,9,10} -> {3,4,2,5,7,9,10} {3,4,2,5,7,9,10} -> {3,4,2,5,7,9,10} {3,4,2,5,7,9,10} -> {3,4,2,5,7,9,10} Lần lặp thứ 5: {3,4,2,5,7,9,10} -> {3,4,2,5,7,9,10} {3,4,2,5,7,9,10} -> {3,2,4,5,7,9,10}, đổi chỗ > {3,2,4,5,7,9,10} -> {3,2,4,5,7,9,10} {3,2,4,5,7,9,10} -> {3,2,4,5,7,9,10} {3,2,4,5,7,9,10} -> {3,2,4,5,7,9,10} {3,2,4,5,7,9,10} -> {3,2,4,5,7,9,10} Lần lặp thứ 6: {3,2,4,5,7,9,10} -> {2,3,4,5,7,9,10}, đổi chỗ > {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} Bây giờ, dãy số xếp, Nhưng thuật tốn khơng nhận điều Thuật tốn cần thêm lần lặp để kết luận dãy xếp khi từ đầu tới cuối mà khơng có lần đổi chỗ thực Lần lặp thứ 7: {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} {2,3,4,5,7,9,10} -> {2,3,4,5,7,9,10} Kết quả: a[7] = {2,3,4,5,7,9,10} e) Quick Sort Mảng a[7] = {7,5,9,4,3,10,2} Trong partition(): iL = low = 0, iR = high = mid = (iL + iR)/2 = 3, pivot = a[mid] = Vòng while đầu tiên, iL 4) Kiểm tra a[iR] < pivot (2 < 4) Vì iL pivot (10 < 4) Thay đổi iR = iR – = Kiểm tra lại a[iR] < pivot (3 < 4) Vì iL 2) => Kết thúc vòng lặp Return iL = Trong quickSort(): Gán pi = iL = Lúc gọi đệ quy để chia mảng a[] thành hai nửa thực việc xếp trên, sau tiếp tục gọi lại cho để lặp lại tồn chu trình mảng phần tử dừng lại đệ quy quickSort(a, low, pi - 1); quickSort(a, pi, high); Chia mảng làm nửa: a[low…pi - 1] = {2,3,4} a[pi…high] = {9,5,10,7} Thực a[low…pi – 1] = {2,3,4} Thực xếp partition() => a[low…pi – 1] = {2,3,4} trả iL = Gán pi = iL = Gọi đệ quy chia hai nửa: a[low…pi - 1] = {2,3} a[pi…high] = {4} -> Dừng đệ quy Thực a1[low…pi - 1] = {2,3} Thực xếp partition() => a[low…pi - 1] = {2,3} trả iL = Gán pi = iL = Gọi đệ quy chia hai nửa: a[low…pi - 1] = {2} -> Dừng đệ quy a[pi…high] = {3} -> Dừng đệ quy Thực a[pi…high] = {9,5,10,7} Thực xếp partition() => a[pi…high] = {5,9,10,7} trả iL = Gán pi = iL = Gọi đệ quy chia hai nửa: a[low…pi - 1] = {5} -> Dừng đệ quy a[pi…high] = {9,10,7} Thực a[pi…high] = {9,10,7} Thực xếp partition() => a[pi…high] = {9,10,7} trả iL = Gán pi = iL = Gọi đệ quy chia hai nửa: a[low…pi - 1] = {9,10} a[pi…high] = {7} -> Dừng đệ quy Thực a[low…pi - 1] = {9,10} Thực xếp partition() => a[low…pi - 1] = {9,10} trả iL = Gán pi = iL = Gọi đệ quy chia hai nửa: a[low…pi - 1] = {9} -> Dừng đệ quy a[pi…high] = {10} -> Dừng đệ quy Tới mảng xếp hoàn tất: -> Kết a[7] = {2,3,4,5,7,9,10} f) Merge Sort Mảng a[7] = {7,5,9,4,3,10,2} l = 0, r = mergeSort(arr[], l, r) If r > l Tìm số nằm mảng để chia mảng thành nửa: middle m = (l+r)/2 Gọi đệ quy hàm mergeSort cho nửa đầu tiên: mergeSort(arr, l, m) Gọi đệ quy hàm mergeSort cho nửa thứ hai: mergeSort(arr, m+1, r) Gộp nửa mảng xếp (2) (3): merge(arr, l, m, r) Kết hoàn tất chia ra: Ta thu mảng con: {7} {5} {9} {4} {3} {10} {2} Thực việc xếp đồng thời trộn mảng lại với merge(): - {7} {5} = > {5,7} (7 > 5) - {9} {4} => {4,9} (9 > 4) - {5,7} {4,9} => {4,5,7,9} - {3} {10} => {3, 10} - {2} => {2} - {3,10} {2} => {2,3,10} - {4,5,7,9} {2,3,10} => {2,3,4,5,7,9,10} Kết quả: a[7] = {2,3,4,5,7,9,10} g) Radix Sort: Mảng a[7] = {7,5,9,4,3,10,2} Đầu tiên, mảng chia thành nhóm dựa vào giá trị chữ số hàng đơn vị chia nhóm sau: [10] // nhóm [2] // nhóm [3] // nhóm [4] // nhóm [5] // nhóm [7] // nhóm [9] // nhóm Sau chia nhóm theo hàng đơn vị, thứ tự phần tử mảng sau: [10,2,3,4,5,7,9] Tiếp theo, mảng chia thành nhóm dựa vào hàng chục Kết nhóm: [2,3,4,5,7,9] // nhóm [10] // nhóm Sau chia nhóm theo hàng chục, thứ tự phần tử mảng sau: [2,3,4,5,7,9,10] Đến đây, tồn số khơng thuộc hàng trăm nên thuật toán dừng lại Câu 10: Lựa chọn thuật toán xếp phù hợp vào cài đặt cho liệu nằm file - giải thích lý Trả lời: - Với mảng xếp sẵn, Bubble Sort cho tốc độ nhanh chi phí để biết mảng có thứ tự thuật toán O(n) - Với mảng gần xếp Insertion Sort lựa chọn tốt số phép hoán đổi phải thực ... {2,3,4 ,5, 7,9,10} -> {2,3,4 ,5, 7,9,10} {2,3,4 ,5, 7,9,10} -> {2,3,4 ,5, 7,9,10} {2,3,4 ,5, 7,9,10} -> {2,3,4 ,5, 7,9,10} {2,3,4 ,5, 7,9,10} -> {2,3,4 ,5, 7,9,10} {2,3,4 ,5, 7,9,10} -> {2,3,4 ,5, 7,9,10} {2,3,4 ,5, 7,9,10}... {3,4,2 ,5, 7,9,10} {3,4,2 ,5, 7,9,10} -> {3,2,4 ,5, 7,9,10}, đổi chỗ > {3,2,4 ,5, 7,9,10} -> {3,2,4 ,5, 7,9,10} {3,2,4 ,5, 7,9,10} -> {3,2,4 ,5, 7,9,10} {3,2,4 ,5, 7,9,10} -> {3,2,4 ,5, 7,9,10} {3,2,4 ,5, 7,9,10}... {3,4 ,5, 2,7,9,10} {3,4 ,5, 2,7,9,10} -> {3,4,2 ,5, 7,9,10}, đổi chỗ > {3,4,2 ,5, 7,9,10} -> {3,4,2 ,5, 7,9,10} {3,4,2 ,5, 7,9,10} -> {3,4,2 ,5, 7,9,10} {3,4,2 ,5, 7,9,10} -> {3,4,2 ,5, 7,9,10} Lần lặp thứ 5: {3,4,2 ,5, 7,9,10}