發表文章

目前顯示的是有「資料結構」標籤的文章

擁抱「資料結構」的「演算法」(17) - 集合和映射

圖片
  前言 講完雜湊之後,接著來認識最後兩個常見的資料結構:集合和映射,剛好他們也都可以延伸使用到 HashMap與 HashSet 生活常識 生活中有哪些東西具有 唯一性 呢?例如全世界找不到第二個你XD,我們的常常使用的 身分證 與 車牌號碼 ,也都具有 唯一性 的,所以可以快速辨別身分 圖片來源: https://www.pexels.com/zh-tw/photo/132774/ 你有使用 網路字典 的習慣嗎?當我們 輸入某個字詞 ,按下搜尋之後,網頁就會 顯示相關的說明文字 ,字典內含有大量的資料,如何快速找到字詞的相關解釋, 關鍵字 就十分重要 或是像 office word 中的目錄功能或一般閱讀書籍的目錄,也可以讓我們快速查找相關內容以及對應的頁碼 圖片來源: microsoft 專業知識 - 集合 Collection 會儲存多筆資料,像是陣列(Array)、串列(List)與 HashSet 都是集合的一種,今天會特別介紹一下 HashSet 集合的特性 排序性:會自動將資料由小至大排序 (例如:SortedSet) 順序性:資料會以某種順序儲存資料 (例如:List) 重覆性:資料是否允許重覆 (例如:List 允許重覆,HashSet 不允許重覆) 鍵值:可使用鍵值來存取資料,每個集合中的元素都有自己的鍵值,鍵值具唯一性 專業知識 - HashSet 是一種實作集合(Collection)的類別 特性 無排序 無順序 資料 不可重覆 ,可以含有空元素 無鍵值 程式碼 下面用 C# 的 HashSet 類別來操作給大家看,我們將數字 0 ~ 10 各別 除以 5 在取餘數 將資料存入  HashSet  與  串列 List  中,會發現資料若已經存在 HashSet 中,則不會重覆新增 數字 除以 5 取餘數 0 0 1 1 2 2 3 3 4 4 5 0 6 1 7 2 8 3 9 4 10 0 HashSet< int > set = new HashSet< int >(); //宣告一個集合 List< int > list = new List< int >(); //宣告一個串列 for ( int i = 0 ; i ...

擁抱「資料結構」的「演算法」(16) - 雜湊 Hash

圖片
  前言 資料結構的部份快到尾聲了,今天會聊聊 雜湊 ,光從文字上來看就非常抽象,不知道是什麼意思,就讓我們一起來揭開它的神秘面紗吧! 生活常識 你有用過果汁機嗎? 圖片來源: freerangestock 我們只要將各式各樣、雜七雜八的 蔬果 通通丟入果汁機,經過 處理 之後,最後都會變成壓榨 液體 ,這種 物品 A  透過某些 處理 之後變成 物品 B  的例子還有哪些呢? 像是 研磨器 ,把各式各樣、雜七雜八的 堅果 丟進去,最後會被磨小變成 粉末 ,那物品 B 可以變回物品 A 嗎?要說一句經典老話:回不去了XD,所以電腦科學中蠻常使用這種方式在幫我們的帳戶密碼做加密,因為只有你自己知道要丟入哪些堅果,才能不斷的製造出特殊成分的粉末,其它人只看看到那堆粉末,無法猜到原始的材料 雜湊 從字面上的意思來說,就是將 原始資料 ,透過一種 特殊複雜的公式 ,湊成 另一種格式 專業知識 - 雜湊 Hash 上述的果汁機或研磨機,就像 特定公式 ,會將原始資料 運算 為其它的資料,我們可以將運算完的結果拿去做額外的利用 定義 資料 A 透過某個 公式 轉換成 資料 B 不可逆 雜湊的應用 蠻多都會用在加密或驗證的領域,像是: 身分證字號 我們的身分證字號不能隨便亂打,有些系統在用戶輸入身分證字號時,會去驗證身分證是否為合法的字串,那個驗證的公式大家可以自己 google 看看 MD5 演算法(Message-Digest Algorithm) 是一種密碼雜湊函式,可以到這個網站  http://www.md5.cz/  將文字輸入,按下 hash 按紐就會得到另 一串文字 ,像是輸入 test 就會得到 098f6bcd4621d373cade4e832627b4f6 ,但雜湊是 不可逆 的,無法從  098f6bcd4621d373cade4e832627b4f6  反推回  test ,如果今天輸入 tesa ,只差一個字,但得到的雜湊值會長得完全不一樣,所以 MD5 常常用來儲存用戶的密碼,系統不會保存使用者原始的密碼,因為這樣資料庫如果被駭客侵入,密碼就會被知道,所以一般來說會將密碼以 MD5 加密後再存入資料庫,等下次用戶登入輸入密碼時,再將密碼做 MD5 運算,將其結果跟資料庫的內...

擁抱「資料結構」的「演算法」(15) - 圖形表示法

圖片
  前言 對圖形有基本的認識之後,我們要來了解圖形是如何被儲存的,就像二元樹會以陣列或串列儲存,那圖形會以什麼方式儲存呢,讓我們一起來看看吧 圖形表示法 圖形表示法有四種,以下會逐一介紹 相鄰矩陣 (Adjacency Matrix) 相鄰串列 (Adjacency List) 相鄰多元串列 (Adjacency Multilist) 索引表 (Index Table) 相鄰矩陣 (Adjacency Matrix) 定義: 有一圖形,有 n 個頂點 ,則可利用  n * n  的  2 維陣列 來表示,如下圖頂點有 4 個,則可以用 4 * 4 的二維矩陣表示,逐一觀察每個頂點與其它頂點有沒有 邊 ,並套用下列規則填滿矩陣中的值 陣列的值與圖形的關係: 陣列中 [ 1, 2 ] 的值 = 1,則代表圖形中的 頂點 1 與 頂點 2 之間 有一條邊 陣列中 [ 3, 2 ] 的值 = 0,則代表圖形中的 頂點 3 與 頂點 2 之間 沒有邊 步驟: 頂點 1  與頂點 2、頂點 3 、頂點 4 之間都有邊,則將矩陣中的 [ 1, 2 ], [ 1, 3 ], [ 1, 4 ] 填 1 頂點 2  與頂點 1、頂點 4 之間都有邊,則將矩陣中的 [2, 1 ], [ 2, 4 ] 填 1 頂點 3  與頂點 1、頂點 4 之間都有邊,則將矩陣中的 [ 3, 1 ], [ 3, 4 ] 填 1 頂點 4  與頂點 1、頂點 2、頂點 3 之間都有邊,則將矩陣中的 [ 4, 1 ], [ 4, 2 ], [ 4, 3 ] 填 1 其它位置填 0, 表示沒有邊存在 特性: 無向圖 的矩陣是 對稱 的,即 [ 1, 2 ] = [ 2, 1 ],對角線皆為 0, 有向圖 則 不一定 無向圖 的矩陣是 對稱 的,所以只要保存矩陣的 上三角 或 下三角 即可,故可僅需  n ( n - 1 ) / 2  的空間 分支度: 有向圖:某一頂點 i 的 分支度 就是 第 i 列 的 元素和 ,例如:頂點 1 的分支度 = 0 + 1 + 1 + 1 = 3 無向圖: 出分支度: 第 i 列 的元素和,如下圖的 頂點3 , 出分支度 就是 第 3 列 的元素和 = 1 + 1 = 2 入分支...