Swift 數據結構學習:線性表(順序存儲)

本篇文章主要內容:node

  • 線性表的基本概念
  • 線性表的存儲結構
    • 順序存儲--通常使用數組實現
    • 鏈式存儲--鏈表

基本概念

線性表定義: 零個或多個數據元素的有限序列。數組

特色:bash

  • 有限:元素的數量是有限的。
  • 序列:表明元素之間是有順序的。若元素存在多個,則第一個元素無前驅,最後一個元素無後繼,其餘每一個元素都有且只有一個前驅和後繼。

存儲結構

順序存儲

**順序存儲結構:**指的是用一組地址連續的存儲單元依次存儲線性表的數據元素。app

根據線性表的特色及順序存儲結構的特色,因此順序存儲能夠用一維數組來實現。ui

順序存儲時線性表基本結構

數據元素的基本結構:spa

class ListNode {
	var value: Int
	    
	public init(_ value: Int) {
	    self.value = value
	}
}
複製代碼

線性表的基本結構:指針

class ArrayList {
	// 存儲數據元素的數組
	var values: [ListNode]?
	
	// 表的長度
	var length: Int {
	    get {
	        if let count = values?.count {
	            return count
	        }
	        return 0
	    }
	}
	    
	// MARK: - 建立
	init() {}
}
複製代碼

順序存儲的一些操做

利用 Swift 中的數組實現,Swift 數組已經內置了插入、刪除等基本操做。這裏爲了探究插入及刪除時發生了什麼,本身實現這兩個過程。code

插入
func insert(_ value: Int, _ index: Int) {
    let newNode = ListNode(value)
    guard let nodes = values else {
        values = []
        values?.append(newNode)
        return
    }
    
    // index 越界
    if index < 0 || index >= nodes.count {
        return
    }
    
    var temp: [ListNode] = []
    
    for i in 0..<nodes.count {
        if i == index {
            temp.append(newNode)
        }
        temp.append(nodes[i])
    }
    values = temp
}
複製代碼
刪除
func remove(at index: Int) {
    guard let nodes = values else {
        return
    }
    
    // 超出數組長度
    if index < 0 && index >= nodes.count { return }
    
    var temp: [ListNode] = []
    for i in 0..<nodes.count {
        if i != index {
            temp.append(nodes[i])
        }
    }
    values = temp
}
複製代碼
查找
func node(at index: Int) -> ListNode? {
    guard let nodes = values else {
        return nil
    }
    
    if index > 0 && index < nodes.count {
        return nodes[index]
    }
    
    return nil
}
複製代碼

順序存儲結構優缺點

  • 優勢:rem

    • 無須爲表中數據元素的邏輯關係增長額外的存儲空間。
    • 能夠快速的存取表中任一位置的元素。(時間複雜度爲 O(1))
  • 缺點get

    • 插入和刪除操做須要移動大量元素。(時間複雜度爲 O(n))
    • 當線性表長度變化較大時,難以肯定存儲空間的容量。
    • 形成存儲空間的碎片。

鏈式存儲

**鏈式存儲結構:**用一組任意的存儲單元存儲數據元素,這組存儲單元能夠是連續的,也能夠是不連續的。數據元素間的邏輯順序是經過結點中的指針域來實現。

關於鏈式存儲會在下一篇文章介紹。

相關文章
相關標籤/搜索