Tôi hiện đang học các thuật toán trong thời gian rảnh nhưng có câu hỏi sau trong khi học các thuật toán select() của chương 3.Hiểu thuật toán lựa chọn trung bình?
Tôi hiểu rằng tôi có thể sử dụng thuật toán select() để tìm số trung bình (số thứ hai n/2) nếu tôi đang sử dụng mảng từ A đến số n.
1) nhưng đây là chút tôi đang cố gắng để hiểu. A = [3, 7, 5, 1, 4, 2, 6, 2]. giả sử đó là mảng. nội dung của mảng sau mỗi cuộc gọi đến phân vùng(), và các tham số trong mỗi cuộc gọi đệ quy của Select() là gì.
một số người có thể giải thích cách họ làm việc này không?
dưới đây là mã giả cho 2 thuật toán.
Select(A, p, r, k) {
/* return k-th smallest number in A[p..r] */
if (p==r) return A[p] /* base case */
q := Partition(A,p,r)
len := q – p + 1
if (k == len) return A[q]
else if (k<len) return Select(A,p,q-1,k)
else return Select(A,q+1,r,k-len)
}
và mã thứ hai là
Partition(A, p, r) { /* partition A[p..r] */
x := A[r] /* pivot */
i := p-1
for j := p to r-1 {
if (A[j] <= x) {
i++
swap(A[i], A[j])
}
}
swap(A[i+1], A[r])
return i+1
}
Cuốn sách tôi đang sử dụng được gọi là nguồn gốc của thuật toán bởi Anne Kaldewaij.
cảm ơn vì điều đó, tôi vừa đọc nó và dễ hiểu hơn cuốn sách. Tuy nhiên, tôi có thêm một câu hỏi nữa, nếu A theo thứ tự sắp xếp ngược lại, tức là A = [n, n-1, ..., 2, 1], có bao nhiêu cuộc gọi đệ quy đến Chọn() sẽ được thực hiện? –
Tôi sẽ để điều này như là một bài tập^_ ^, nhưng như một gợi ý, lưu ý rằng thuật toán sẽ chọn phần tử đầu tiên của mảng làm trục xoay mỗi lần. Điều này sẽ di chuyển trục ở đâu? Theo thứ tự nào, các phần tử còn lại sẽ kết thúc? Cũng như một gợi ý, suy nghĩ về những gì quicksort có thể làm ở đây. – templatetypedef
Câu đầu tiên của điểm số 3, tôi nghĩ bạn có nghĩa là "trục xoay ở vị trí __smaller__ so với k". – Blastfurnace