一、什么是有序表OrderedList
- 有序表是一种数据项依照其某可比性质(如整数大小、 字母表先后) 来决定在列表中的位置
- 越“小”的数据项越靠近列表的头, 越靠“前”
二、抽象数据类型:有序表OrderedList
2.1 OrderedList的基本操作
函数 | 含义 |
---|---|
OrderedList() | 创建一个空的有序表 |
add(item) | 在表中添加一个数据项,并保持整体顺序,item原不存在 |
remove(item) | 从有序表中移除一个数据项,item应存在,有序表被修改 |
search(item) | 在有序表中查找item,返回布尔类型值 |
isEmpty() | 返回OrderedList是否为空 |
size() | 返回表中包含数据项的个数 |
index(item) | 返回数据项在表中的位置,item应存在 |
pop() | 从有序表末尾移除数据项,假设原表至少有1个数据项 |
pop(pos) | 移除位置为pos的数据项,假设原表存在位置pos |
2.2 Python实现
- 在实现有序表的时候, 需要记住的是, 数据项的相对位置, 取决于它们之间的“大小”比较
- 以整数数据项为例, (17, 26, 31, 54, 77, 93)的链表形式如图
有序表OrderedList实现
- 同样采用链表方法实现
- Node定义相同
- OrderedList也设置一个head来保存链表表头的引用
- 对于isEmpty/size/remove这些方法,与 节 点 的 次 序 无 关 , 所 以 其 实 现 跟UnorderedList 是一样的。
- search/add方法则需要有修改
- 对于有序表来说, 可以利用链表节点有序排列的特性, 来为search节省不存在数据项的查找时间。一旦当前节点的数据项大于所要查找的数据项,则说明链表后面已经不可能再有要查找的数据项,可以直接返回False。
- 相比无序表, 改变最大的方法是add, 因为add方法必须保证加入的数据项添加在合适的位置, 以维护整个链表的有序性
代码如下:
class Node:
def __init__(self,initdata):
self.data = initdata
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self,newdata):
self.data = newdata
def setNext(self, newnext):
self.next = newnext
def add(self, item):
current = self.head
previous = None
stop = False
###发现插入位置#####
while current != None and not stop:
if current.getData()>item:
stop = True
else:
previous = current
current = current.getNext()
temp = Node(item)
###插入在表头###
if previous == None:
temp. setNext(self.head)
self.head = temp
###插入在表中###
else:
temp.setNext(current)
previous.setNext(temp)
def size(self):
current = self.head
count = 0
while current!=None:
count += 1
current = current.getNext()
return count
def search(self,item):
current = self.head
found = False
while current != None and not found and not stop:
if current.getData() == item:
found = True
else:
if current.getData()>item:
stop = True
else:
current = current.getNext()
return found
链表实现的算法分析
对于一个包含节点数为n的链表
- isEmpty是O(1),因为仅需要检查head是否为None
- size是O(n),因为除了遍历到表尾,没有其它办法得知节点的数量
- search/remove以及有序表的add方法,则是O(n),因为涉及到链表的遍历,按照概率其平均操作的次数是n/2
- 无序表的add方法是O(1),因为仅需要插入到表头