1. 程式人生 > 其它 >Java自學-集合(2)

Java自學-集合(2)

記憶體

  • 計算機的作用

    • 儲存和運算二進位制資料
  • 計算機如何實現1+1=?的操作

    • 將1載入到記憶體中,然後基於計算機的加法暫存器對指定記憶體中儲存的資料進行加法運算。
  • 變數

    • 本質講,變數指的就是計算機中的某一塊記憶體空間
    • 記憶體空間有兩個固有屬性
      • 地址
        • 使用16進位制數表示
        • 作用:方便cpu定址(門牌號)
      • 大小
        • bit,byte,kb,mb,gb,tb
        • 決定該塊記憶體儲存的數值的範圍
        • 相同型別的資料,開闢固有大小的記憶體空間
          • 整形資料:4byte
          • 浮點型:4byte(單精度),8byte(雙精度)
          • 字元型:1byte
  • 引用和指向

    • 引用:就是變數。通常講,變量表示的就是一塊記憶體空間的地址。
    • 指向:如果一個變數或引用儲存和表示了一塊記憶體空間的地址,則該變數或引用指向了該塊記憶體空間。

順序表

  • 概念

    • 將元素順序地存放在一塊連續的儲存區裡,元素間的順序關係由它們的儲存順序自然表示。
  • 順序表的結構可以分為兩種形式:

    • 單資料型別(如陣列)
      • 資料元素本身連續儲存,每個元素所佔的儲存單元大小固定相同,元素的下標是其邏輯地址,而元素儲存的實體地址(實際記憶體地址)可以通過儲存區的起始地址Loc (e0)加上邏輯地址(第i個元素)與儲存單元大小(c)的乘積計算而得,即:Loc(ei) = Loc(e0) + c*i
      • 故,訪問指定元素時無需從頭遍歷,通過計算便可獲得對應地址,其時間複雜度為O(1)。
    • 多資料型別(如元組和列表)
      • 元素的大小不統一,則需要採用元素外接的形式,將實際資料元素另行儲存,而順序表中各單元位置儲存對應元素的地址資訊(即連結)。由於每個連結所需的儲存量相同,這個量通常很小,順著連結找到實際儲存的資料元素
      • 這樣的順序表也被稱為對實際資料的索引,這是最簡單的索引結構。
  • 弊端

    • 順序表的構建需要預先知道資料大小來申請連續的儲存空間,而在進行擴充時又需要進行資料的搬遷,所以使用起來並不是很靈活。

連結串列

  • 定義

    • 連結串列(Linked list)是一種常見的基礎資料結構,是一種線性表,但是不像順序表一樣連續儲存資料,而是在每一個節點(資料儲存單元)裡存放下一個節點的位置資訊(即地址)
  • 優點

    • 連結串列結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。
  • 單向連結串列

    • 單向連結串列也叫單鏈表,是連結串列中最簡單的一種形式,它的每個節點包含兩個域,一個資訊域(元素域)和一個連結域。這個連結指向連結串列中的下一個節點,而最後一個節點的連結域則指向一個空值。
  • 單鏈表操作

    • is_empty() 連結串列是否為空
    • length() 連結串列長度
    • travel() 遍歷整個連結串列
    • add(item) 連結串列頭部新增元素
    • append(item) 連結串列尾部新增元素
    • insert(pos, item) 指定位置新增元素
    • remove(item) 刪除節點
    • search(item) 查詢節點是否存在
  • 單鏈表實現:

    # coding:utf-8
    
    class Node:
        '''單鏈表的節點'''
        def __init__(self,item):
            self.item = item
            self.next = None
    
    class Link_list:
        def __init__(self):
            self._head = None
    
        def is_empty(self):
            '''判空'''
            return self._head == None
    
        def add(self,item):
            '''頭部新增'''
            node = Node(item)
            node.next = self._head
            self._head = node
    
        def append(self,item):
            '''尾部新增'''
            node = Node(item)
            #先判空,若為空連結串列,則_head指向新節點
            if self.is_empty():
                self._head = node
            #不為空,則找到尾節點,然後尾節點的next指向新節點
            else:
                cur = self._head
                while cur.next:
                    cur = cur.next
                cur.next = node
    
        def length(self):
            '''連結串列長度'''
            if self.is_empty():
                return 0
            count = 1
            cur = self._head
            while cur.next:
                count += 1
                cur = cur.next
            return count
    
        def travel(self):
            '''遍歷'''
            cur = self._head
            while cur:
                print(cur.item)
                cur = cur.next
    
        def search(self,item):
            '''查詢節點是否存在'''
            cur = self._head
            while cur:
                if cur.item == item:
                    return True
                cur = cur.next
            return False
    
        def insert(self,pos,item):
            '''指定位置插入節點'''
            node = Node(item)
            #判斷插入位置,如果為0,則從頭部插入
            if pos == 0:
                self.add(node)
                return
            #其它位置,需要找到插入點前面一個節點pre和後面一個節點cur
            pre = None
            cur = self._head
            for i in range(pos):
                pre = cur
                cur = cur.next
            pre.next = node
            node.next = cur
    
        def remove(self,item):
            '''刪除節點'''
            pre = None
            cur = self._head
            while cur:
                if cur.item == item:
                    if not pre:
                        self._head = cur.next
                    else:
                        pre.next = cur.next
                    break
                pre = cur
                cur = cur.next
    
    if __name__ == '__main__':
        link = Link_list()
        print(link.is_empty())
        link.add(1)
        print(link.is_empty())
        link.add(2)
        link.append(3)
        link.insert(1,2.5)
        print(link.search(4))
        link.travel()