Sort problem
2024-02-29
làm sao để sắp xếp 10G dữ liệu nhưng chỉ có 1G RAM
Các thuật toán cơ bản O(n2)
Chèn insertion:
for i in range(1, n): # for vị trí i in arr:
key = arr[i] # lưu lại phần tử để tí chèn vào vị trí đúng (rút ra)
j = i-1
while j >= 0 and key < arr[j]: # lùi từ i đến đầu dãy tới khi gặp phần tử < phần tử thứ i (while lớn hơn thì vẫn chạy)
arr[j+1] = arr[j] # mỗi lần lùi thì đẩy phần tử trước đó lên
j -= 1 # lùi
arr[j+1] = key # cuối cùng chèn lại phần tử vào vị trí đúng
[13, 14, 15, 5, 6]
[13, 14, 15, *, 6] 5 để ra ngoài
[13, 14, * ,15, 6] đẩy 15 lên, điều kiện 5 vẫn chưa > 14
[13, * ,14 ,15, 6] đẩy 14 lên
[ *, 13,14 ,15, 6] đẩy 13 lên
[ 5, 13,14 ,15, 6] chèn 5 vào
Lựa chọn selection sort
int i, j, min, temp;
for (i = 0; i < n-1; i++) { // for các vị trí i
min = i;
for (j = i+1; j < n; j++){ // for từ vị trí đến cuối dãy
if (a[j] < a[min]) min = j; // tìm vị trí có phần tử nhỏ nhất
}
swap(a[i], a[min]); // chuyển phần tử nhỏ nhất tại vị trí đã tìm được lên vị trí i
}
Nổi bọt bubble sort
int i, j;
for (i = (n-1); i >= 0; i--) { // duyệt nhiều lần, mỗi lần lặp sẽ đẩy phần tử lớn nhất xuống cuối dãy
for (j = 1; j <= i; j++){ // trong mỗi lần lặp sẽ đi từ đầu dãy tới phần tử lớn nhất đã được sắp xếp đúng
if (a[j-1] > a[j]) // còn lớn hơn thì còn đổi chỗ -> phần tử lớn sẽ được chuyển dần về cuối dãy
swap(a[j-1],a[j]);
}
}
Các thuật toán nâng cao hơn O(nlogn)
Các thuật toán pro hơn nữa
External sort
External merge sort: giả xử có 10G dữ liệu mà chỉ có 1G bộ nhớ
Chia 10G ra làm 10 phần, mỗi phần 1G cho lần lượt vào RAM để sort. 10 phần đó, mỗi phần 1G để ra ngoài external storage(mỗi phần này đã được sort)
Chia mỗi 1G thành 1G/90Mb phần (miễn sao mỗi phần 90Mb. tính bằng cách lấy 1G bộ nhớ - 100MB buffer đầu ra. sau đó /10 phần).
Mỗi lần sẽ load mỗi phần 90Mb, tổng 900Mb, sort trên buffer 100Mb. đầy buffer thì ghi ra đĩa. hết 90Mb mỗi phần thì load tiếp 90Mb tiếp theo của phần tương ứng
Chú ý. phần nào hết thì bỏ đi k ghi vào nữa