【數據結構與算法】

數據結構與算法概述

數據結構的定義

咱們如何把現實中大量並且很是複雜的問題以特定的數據類型(個體)和特定的存儲結構(個體的關係)保存到相應的主存儲器(內存)中,以及在此基礎上爲實現某個功能而執行的相應操做,這個相應的操做也叫作算法。

數據結構 == 個體 + 個體關係python

算法 == 對存儲數據的操做算法

數據結構的特色

數據結構是軟件中最核心的課程。

程序 = 數據的存儲 + 數據的操做 + 能夠被計算機執行的語言。數組

算法

衡量算法的標準

  • 時間複雜度 指的是大概程序執行的次數,而非程序執行的時間。
  • 空阿金複雜度 值得是程序執行過程當中,大概縮佔用的最大內存。
  • 難易程度
  • 健壯性

須要熟練掌握的算法

常見的排序

  • 冒泡排序
  • 選擇排序
  • 插入排序
  • 快速排序
  • 歸併排序
  • 希爾排序
  • 計數排序
  • 二分法查找元素

常見的查找

  • 順序查找
  • 二分法查找

其餘的算法

  • 貪心算法
  • 遞歸算法

線性結構

比較通俗的講,把全部的節點用一根線串起來的結構就稱之爲線性結構。線性結構分爲兩種方式:數組、鏈表。

數組與鏈表的區別

數組須要一塊連續的內存空間來存儲,堆內存的要求比較高。若是咱們申請一個100M大小的數組,當內存中沒有連續的、足夠大的空間時,即便內存的剩餘可用空間大於100M,任然會申請失敗。而鏈表偏偏相反,它並不須要一塊連續的內存空間,他經過「指針」將一組零散的內存塊串聯起來使用,因此申請的是大小是100M的鏈表,name根本不會有問題。

1558612288328

連續存儲(數組)

數組,在python語言中成爲列表,是一種基本的數據結構類型。

列表的優缺點

  • 優勢:
    • 存取速度快
  • 缺點:
    • 事先須要知道數組的長度
    • 須要大塊的連續內存
    • 插入刪除很是的慢,效率極低

注:列表的其餘問題,請百度python基礎。數據結構

離散存儲(鏈表)

鏈表的定義

  • n個節點離散分配
  • 彼此經過指針相連
  • 每一個節點都有一個前驅節點,每一個節點只有一個後續節點
  • 首節點沒有前驅節點,尾節點沒有後續節點

鏈表的優缺點

  • 優勢:
    • 空間沒有限制,插入刪除元素很快
  • 缺點:
    • 查詢比較慢

鏈表的結構

鏈表的及誒單結構以下:指針

1558612776787

data爲自定義的數據,next爲下一個節點的地址。code

鏈表的專業術語

  • 首節點:第一個有效節點。
  • 尾節點:最後一個有效節點。
  • 頭結點:第一個有效節點以前的那個節點,頭結點並不存儲任何數據,目的是爲了方便對鏈表的操做。
  • 頭指針:指向頭結點的指針變量。(上圖在頭結點的左側,未畫出)
  • 尾指針:指向尾節點的指針變量。

鏈表的分類

  • 單鏈表
  • 雙鏈表 每個節點有兩個指針域
  • 循環鏈表 能經過任何一個節點找到其餘全部的節點
  • 非循環列表

鏈表的算法

  • 增長
  • 刪除
  • 修改
  • 查找
  • 總長度

Python語言實現單鏈表的增刪查

在Python語言中用面向對象組合的方式,代替指針指向,更加的方便,簡單,容易理解。對象

# Use The Linked List sort Liangshan Po 108 Heroes


#
class Hero():
    def __init__(self, no=None, name=None, nick_name=None, next=None):
        self.no = no
        self.name = name
        self.nick_name = nick_name
        self.next = next


def add_hero(head, hero):
    current_position = head
    while current_position.next and hero.no > current_position.next.no:
        current_position = current_position.next
    hero.next = current_position.next
    current_position.next = hero


def get_all(head):
    current_position = head
    while current_position.next:
        print("編號:%s,姓名:%s,外號:%s" % (
            current_position.next.no, current_position.next.name, current_position.next.nick_name))
        current_position = current_position.next


def delete_hero(head, hero):
    current_position = head
    if current_position.next:
        while current_position.next and current_position.next.no < hero.no:
            current_position = current_position.next
        current_position.next = current_position.next.next
    else:
        print("鏈表爲空")

head = Hero()
hero = Hero(1, '宋江', '及時雨')
# hero1 = Hero(2, '盧俊義', '玉麒麟')
# hero2 = Hero(3, '吳用', '智多星')
# hero3 = Hero(5, '林沖', '豹子頭')
# hero4 = Hero(4, '公孫勝', '入雲龍')
# add_hero(head, hero)
# add_hero(head, hero1)
# add_hero(head, hero2)
# add_hero(head, hero3)
# add_hero(head, hero4)
# get_all(head)

print("---------------------")
delete_hero(head, hero)
get_all(head)
相關文章
相關標籤/搜索