ý tôi là dùng cái stack có push/pop/getMedian trong O(1) này để thực hiện sort trên 1 mảng. Khi đó sort mảng chỉ mất O(n) là bất khả thi.
https://stackoverflow.com/questions...al-data-structure-o1-to-find-median-of-set-o1
cho 1 magic stack có push và getMedian trong O(1)
sort mảng A như sau:
- tìm min, max trong A, O(n)
- push các phần tử trong mảng A vào magic stack, n lần O(1) là O(n)
- push n-1 lần giá trị min-1 vào magic stack, O(n). Khi này median sẽ là phần tử nhỏ nhất trong mảng A. Gọi getMedian để lấy ra phần tử đó.
- lặp lại n-1 lần: insert 2 lần giá trị max+1 vào magic stack. Khi này median sẽ là phần tử nhỏ tiếp theo trong mảng A, gọi getMedian để lấy ra phần tử đó. Lặp n-1 lần, mỗi lần push/getMedian O(1) thì tổng cộng là O(n)
=> tổng là O(n)
vd A = 1,4,5,3,2
min = 1, max = 5, n = 5
push các phần tử trong A vào magic stack M, M chứa 2,3,5,4,1
push 4 lần giá trị 0 vào M, M chứa 0,0,0,0,2,3,5,4,1, getMedian trả về 1.
lặp lại 4 lần:
push 2 lần giá trị 6 vào M, M chứa 6,6,0,0,0,0,2,3,5,4,1, getMedian trả về 2.
push 2 lần giá trị 6 vào M, M chứa 6,6,6,6,0,0,0,0,2,3,5,4,1, getMedian trả về 3.
push 2 lần giá trị 6 vào M, M chứa 6,6,6,6,6,6,0,0,0,0,2,3,5,4,1, getMedian trả về 4.
push 2 lần giá trị 6 vào M, M chứa 6,6,6,6,6,6,6,6,0,0,0,0,2,3,5,4,1, getMedian trả về 5.
=> sorted A = 1,2,3,4,5
mảng A được sort trong O(n) là vô lý nên ko có magic stack này