基本數據結構——線性結構(有序表)

1. 什麼是有序表(OrderedList)

有序表是一種數據項依照其某可比性質(如整數大小、字母表先後)來決定在列表中的位置。越“小”的數據項越靠近列表的頭,越靠“前”。
在這裏插入圖片描述

2.抽象數據類型有序表(OrderedList)定義的操作

在這裏插入圖片描述

3.有序表OrderedList實現

在實現有序表的時候,需要記住的是,數據項的相對位置,取決於它們之間的“大小”比較。以整數數據項爲例,(17,26,31,54,77,93)的鏈表形式如下圖所示。
在這裏插入圖片描述
有序表(OrderedList)同樣採用鏈表方法實現,Node定義相同,OrderedList也設置了一個head來保存鏈表表頭的引用。

class OrderedList:
    def __init__(self):
        self.head=None

對於isEmpty/size/remove這些方法,與節點的次序無關,所以其實現跟UnorderedList是一樣的。search/add方法則需要由修改。

3.1 有序表實現:search方法

無序表的search中,如果需要查找的數據項不存在,則會搜遍整個鏈表,知道表尾。
對於有序表來說,可以利用鏈表節點有序排列的特性,來爲search節省不存在數據項的查找時間。一旦當前節點的數據項大於索要查找的數據項,則說明鏈表後面已經不可能再有要查找的數據項,可以直接返回False。
例如要在下圖查找數據項45
在這裏插入圖片描述

python代碼實現

class OrderedList:
    def __init__(self):
        self.head=None
        
def search(self,item):
    current=self.head
    found=False
    stop=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

3.2 有序表實現:add方法

相比於無序表,改變最大的方法是add,因爲ad方法必須保證加入的數據項添加在合適的位置,以維護整個鏈表的有序性。
例如,在(7,26,54,77,93)的有序表中,加入數據項31,我們需要沿着鏈表,找到第一個比31大的數據項54,將31插入到54的前面
在這裏插入圖片描述
由於涉及到的插入位置是當前節點之前,而鏈表無法得到“前驅”節點的引用,所以同remove方法類似,引入一個previous的引用,跟隨當前節點current。

python代碼實現

#定義節點
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#修改下一個節點的指向引用
#定義有序表
class OrderedList:
    def __init__(self):
        self.head=None
#有序表實現add方法
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)

4.鏈表實現的算法分析

對於鏈表複雜度的分析,主要是看響應的方法是否涉及到鏈表的遍歷。、
對於一個包含節點數爲n的鏈表:
isEmpty是O(1),因爲僅需要檢查head是否爲None
size是O(n),因爲除了遍歷到隊尾,沒有其他辦法得知節點的數量
search/remove以及有序表的add方法複雜度爲O(n),因爲涉及到鏈表的遍歷,按照概率其平均操作的次數是n/2
無序表的add方法的複雜度爲O(1),因爲僅需要插入到表頭
鏈表實現的list跟python內置的列表數據類型,在有些相同方法的實現上的時間複雜度不同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章