Có thể không khó để triển khai danh sách phân loại của riêng bạn trên Python.Dưới đây là một bằng chứng của khái niệm:
import bisect
class sortlist:
def __init__(self, list):
self.list = list
self.sort()
def sort(self):
l = []
for i in range(len(self.list)):
bisect.insort(l, self.list[i])
self.list = l
self.len = i
def insert(self, value):
bisect.insort(self.list, value)
self.len += 1
def show(self):
print self.list
def search(self,value):
left = bisect.bisect_left(self.list, value)
if abs(self.list[min([left,self.len-1])] - value) >= abs(self.list[left-1] - value):
return self.list[left-1]
else:
return self.list[left]
list = [101, 3, 10, 14, 23, 86, 44, 45, 45, 50, 66, 95, 17, 77, 79, 84, 85, 91, 73]
slist = sortlist(list)
slist.show()
slist.insert(99)
slist.show()
print slist.search(100000000)
print slist.search(0)
print slist.search(56.7)
========= Kết quả ============
[3, 10, 14, 17, 23 , 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 101]
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 99, 101]
'memcpy' vẫn là thao tác * O (n) *. Tôi không chắc cách Python thực hiện danh sách * chính xác *, nhưng đặt cược của tôi sẽ là chúng được lưu trữ trong bộ nhớ liền kề (chắc chắn không phải là danh sách được liên kết). Nếu đó thực sự là như vậy, việc chèn bằng cách sử dụng 'bisect' mà bạn chứng minh sẽ có độ phức tạp * O (n) *. – Stephan202
... và sau đó ví dụ đã biến mất;) – Stephan202
@ stephan202: Xin lỗi, tôi nghĩ rằng nó xứng đáng là một qeustion trong chính nó như là một vấn đề hoàn toàn riêng biệt! –