翻譯:程序員數據結構基礎:選擇正確的數據結構

?

本文轉載自GameDev.net,僅供學習交流。因為剛剛開始學習翻譯,難免有些疏漏,如果有哪些地方翻譯的不正確,請不吝告知,萬分感謝。

原文鏈接:http://www.gamedev.net/page/resources/_/technical/general-programming/data-structures-for-pre-college-programmers-choosing-the-right-structure-r2991

?

網絡上的許多初學者還是學生。通常初學者通過在網上看教程,從書上復制代碼和嘗試一些感興趣的東西來學習。

這篇文章是初級開發者所需要了解的數據結構基礎系列文章中的一篇。前一篇文章分析了非線性數據結構。(Non-Linear Structures.)

這篇文章是幫助初學者理解如何選擇一個合適的數據結構或者容器類型。

數據結構

????????? 在該系列的前幾篇文章中說明了最常用的一些數據結構,這里只是一個概括。

????????? 線性的結構包括:數組,動態數組和鏈表。他們之所以是線性的,是因為他們總是呆在你放置他們的地方。數組的隨機訪問 是非常快的,而且在數組末尾添加和刪除數據具有適當良好的性能。如果你頻繁地在中間添加或刪除數據,鏈表將是一個非常好的選擇。

???????? 線性端點數據結構包括:堆和隊列等。他們的工作方式與現實世界中的同名操作非常相似。堆,比如一堆木板或者一個數據堆,你可以把東西放在(push)堆的最上面,可以直接用最早面的一塊木板或者數據,或者你可以直接拿掉(pop)最上面的一個木板或都數據。隊列,像一人排成一個隊伍或一個隊列數據,以從隊尾加入,從隊首移除的方式來工作。

????????? 非線性數據結構包括:數據字典,有序集和無序集。這些結構是內部非線性的,也就是說你把相關數據插入的順序和取出數據的順序是基本無關的。數據字典的工作方式與真正的字典非常相似,它擁有一個關鍵值(key:用來索引的)和值(value:數據值)。一個有序集(ordered set)跟排序過的只包含關鍵值(key)不包含值(value)的數據字典一樣。至于無序集則是像一個數據的抓斗袋(類似抽獎的暗箱),但無序集這個名字是有點誤導性的,實際是他們也是有序的,只是他們排序的方式對我們的使用來說是沒有什么用的。這些非線性的數據結構非常適合快速的查找數據。

一個好的數據結構的影響

? ? ? ? ?大多數時候,程序員只是需要遍歷整個數據集合。通常,當我們需要從頭訪問每個數據項時,我們不關心數據內部是怎么排序的。這種常見的情況中,數據結構的選擇不是很大的問題。

??????? 當有疑問的時候最普遍的選擇是動態數組,它可以變成任意的大小,中規中矩,在后期有需要時也可以很容易的轉換成其它的數據結構。

?????? 但有時候他也有一些問題。

?????? 在游戲中,一個很常見的問題就是尋路。你需要找出一個從ab的路徑。最常見的尋路算法是a星算法。在a星算法中你需要一個數據結構來存儲部分路徑。這個結構應該是排序過的,這樣可以把我們最最想要的路徑擺放在容器的最前面方便我們使用。如果該路被檢測后發現不是一個完整的路徑,該算法則會使他成為一個更大的路徑的一部分并加入的相當的容器中。?

???????? 使用動態數組作為a星算法的容器將會是一個糟糕的選擇,原因如下:

  1. 從動態數組的開頭移除一個數組是我們所能執行最低效的一個操作。
  2. 當加入了一個新的路徑,我們對動態數組進行重新排序是非常低效的。

?

????????? 如果記得之前所說的,還有是這種類型的訪問的最優化的數據結構。我們可以移除最前面的數據,把數據從最后面插入,并自動重排索引出最佳的路徑。優先隊列是a星算法容器類型的一個好的選擇。它通常都內置在語言內部,并通過完善的測試。

根據使用的模式來寫選擇

????????? 使用什么樣的數據結構,通常依據你所使用的設計模式。

動態數組 -- 默認的選擇

????????? 當有疑問的時候,使用動態數組。在c++叫做vector,在java中叫做ArrayList,c#中叫做List

????????? 動態數組通常可以符合使用要求。它大多數操作都有好的性能 ,剩余的操作性能也不差。如果你發現你需要其它的數據結構,動態數組也是最容易進行修改的。

-- 只有一端

?????????? 如果你只在單獨的一端添加或刪除。使用堆,在c++中是stack,在javac#中都叫Statck

?????????? 有許多算法依賴堆來實現。我的第一個反應就是雙堆計算器(two-stack calculator)。數學問題像漢諾塔也可以通過堆來解決。當然,在游戲編程中,你可能用不到他們。

??????????? 游戲工具經驗解析數據。解析器在很大程度上依賴堆數據結構來保證配對項匹配正確。

???????????? 如果你正在使用各種各樣的ai類型。你可以發現堆數據結構對于自動機家族中的自動下推器是難以估計的實用。

隊列 -- 先進先出

????????? 如果你需要從兩端進行增刪數據,那你你可以使用隊列或者雙端隊列。在c++中叫做queue(隊列)或者deque(雙端隊列).java中你可以使用Queue或者Deque接口,都是基于LinkList實現的。在c#中只有一個Queue類型,沒有內置雙端隊列(deque)。

????????? 如果你需要保證某些重要的東西第一時間被處理,但除非所有的事情都有序的發生,并且按優先級順序完成。這時你可以使用優先級隊列來處理,在c++中稱為priority_queue.java中稱為PriorityQueue.C#中你需要自己來實現這個優先級隊列。

非線性結構 -- 快速索引

???????? 如果你需要創建一個穩定的數據結構,并頻繁的進行隨機查找,那么你需要使用非線性數據結構。

???????? 非線性數據結構有的保存一對數據,有的保存獨立的數據。有的是對用戶友好的排序,有的是對計算機友好的排序。如果要列出他們之間的所有組合,又將是一篇文章。實際上,那些在之前的文章中已經詳細的描述過了。 對于這些非線性結構哪些滿足特定的需求,可以查看之前的關于非線性數據結構的文章

鏈表 -- 頻繁有序的修改

???????? 如果你需要頻繁的在容器中間進行操作數據(增刪),而且你只需要順序的遍歷列表。你可以使用鏈表,在c++中稱為list, javac#中稱為LinkedList

??????? 當數據需要頻繁的增刪,并且在增刪后必須保持有序狀態時,鏈表是一個非常好的容器選擇。

結論

???????? 選擇正確的數據結構可以讓算法的性能是非常大的改善。

??????? 理解主要的數據結構,包含他們的優缺點可以幫助你選擇你所需要的數據結構。

??????? 我建議你們深入的研究學習這些主要的數據結構。深入學習這些數據結構的計算機科學學位課程通常會持續數星期內。

??????? 希望你已經了解了主要的數據結構,可以在沒有進行數周深入的學習這些數據結構時可以選擇一個好的數據結構。

???????? 這系列的文章已經結束了,感謝閱讀。

本文轉載自GameDev.net,僅供學習交流。因為剛剛開始學習翻譯,難免有些疏漏,如果有哪些地方翻譯的不正確,請不吝告知,萬分感謝。

原文鏈接:http://www.gamedev.net/page/resources/_/technical/general-programming/data-structures-for-pre-college-programmers-choosing-the-right-structure-r2991

?

轉載于:https://www.cnblogs.com/wtu-sos/p/5118860.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458424.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458424.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458424.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于Xcode隱藏打印的logs的方法

https://www.cnblogs.com/jukaiit/p/5881062.html 第一步: 第二步: 第三步: 添加參數: Name :OS_ACTIVITY_MODE Value : disable

指針函數與函數指針的區別

首先它們之間的定義:1、指針函數是指帶指針的函數,即本質是一個函數,函數返回類型是某一類型的指針。 類型標識符 *函數名(參數表)int *f(x,y);首先它是一個函數,只不過這個函數的返回值是一個地址值。函數返回值必須用…

數組字典

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {autoreleasepool { //把字典放到數組中NSDictionary *dic1{"name":"小明","class":"IOS8","age":"22"};NSDictionary *dic2{&…

C++走向遠洋——63(項目二2、兩個成員的類模板)

*/ * Copyright (c) 2016&#xff0c;煙臺大學計算機與控制工程學院 * All rights reserved. * 文件名&#xff1a;text.cpp * 作者&#xff1a;常軒 * 微信公眾號&#xff1a;Worldhello * 完成日期&#xff1a;2016年6月4日 * 版本號&#xff1a;V1.0 * 問題描述&…

iOS 抓包工具 charles工具

在Charles官網下載最新的 安裝包 在電腦上安裝完成之后&#xff0c;以 注冊碼 Registered Name: https://zhile.io License Key: 48891cf209c6d32bf4 進行注冊即可完成 在手機上面設置代理&#xff1a;輸入電腦的網絡IP以及端口號 以下為查找的步驟&#xff1a; 在手機上手…

指針數組與數組指針詳解

指針數組與數組指針詳解 1.什么是指針數組和數組指針&#xff1f; 指針數組&#xff1a;指針數組可以說成是”指針的數組”&#xff0c;首先這個變量是一個數組&#xff0c;其次&#xff0c;”指針”修飾這個數組&#xff0c;意思是說這個數組的所有元素都是指針類型&#xff0…

寫一個Android輸入法01——最簡步驟

本文演示用Android Studio寫一個最簡單的輸入法。界面和交互都很簡陋&#xff0c;只為剔肉留骨&#xff0c;彰顯寫一個Android輸入法的要點。 1、打開Android Studio創建項目&#xff0c;該項目和普通APP的不同之處在于它不需要添加任何Activity&#xff1a;我給該輸入法命名為…

句柄與指針的區別

句柄實際上是一種指向某種資源的指針&#xff0c;但與指針又有所不同&#xff1a;指針對應著一個數據在內存中的地址&#xff0c;得到了指針就可以自由地修改該數據。 Windows并不希望一般程序修改其內部數據結構&#xff0c;因為這樣太不安全。所以Windows給每個使用GlobalAll…

iOS 11 適配

http://blog.csdn.net/st646889325/article/details/79066361 這一個不錯的文章

談談自己對于Auth2.0的見解

Auth的原理網上有很多&#xff0c;我這里就不在贅述了。 這里有張時序圖我個人覺得是比較合理而且直觀的&#xff0c;&#xff08;感謝這篇博文&#xff1a;http://justcoding.iteye.com/blog/1950270&#xff09; 參照這個流程&#xff0c;模擬了下部分代碼&#xff0c;當然是…

某個時間點 幾天后

1、某個時間點 3天后 NSDate *maxDate [NSDate dateWithTimeInterval:3 * 24 * 60 * 60 sinceDate:date];//3天后 2、現在 3天后 NSDate *minDate [[NSDate date] initWithTimeIntervalSinceNow:3 * 24 * 60 * 60];

iPad開發--QQ空間,處理橫豎屏布局,實現子控件中的代理

一.主界面橫豎屏效果圖 二.主界面加載, 初始化Dock(紅色框的控件),判斷程序啟動時的屏幕方向.調用自己- (void)transitionToLandScape:(BOOL)isLandScape;方法,通知子控件屏幕方向改變,將此事件一直傳遞下去程序運行過程中屏幕方向改變會調用- (void)viewWillTransitionToSize:…

C++ Vector 匯總

C vector erase函數最近使用了順序容器的刪除元素操作&#xff0c;特此記錄下該函數的注意事項。 在Cprimer中對c.erase(p) 這樣解釋的&#xff1a;c.erase(p) 刪除迭代器p所指向的元素&#xff0c;返回一個指向被刪元素之后元素的迭代器&#xff0c;若p指向尾元素&#xff…

vNext之旅(2):net451、dotnet5.4、dnx451、dnxcore50都是什么鬼

繼上次”vNext之旅&#xff08;1&#xff09;&#xff1a;從概念和基礎開始”之后再次學習vNext重新遇到了弄不懂的事情&#xff0c;花了一些時間學習&#xff0c;今天來分享一下&#xff0c;為后人節省些時間。起因 在用vNext造輪子——框架的時候引入“Microsoft.Dnx.Runtime…

C++中模板使用詳解

轉自&#xff1a;http://www.360doc.com/content/09/0403/17/799_3011262.shtml 1. 模板的概念。 我們已經學過重載(Overloading)&#xff0c;對重載函數而言,C的檢查機制能通過函數參數的不同及所屬類的不同。正確的調用重載函數。例如&#xff0c;為求兩個數的最大值&#xf…

騰訊2016春招安全崗筆試題解析

騰訊2016春招安全崗筆試題解析 昨天&#xff08;4月2日&#xff09;晚上7:00到9:00做了騰訊春招安全崗的筆試題。下面解析一下&#xff1a; 題目解析 1 在生成隨機數前用當前時間設置隨機數種子應該是安全的。如果程序用固定的數產生隨機數&#xff0c;其結果也是固定的。如果用…

網絡請求數據解析時,判斷數據是否為空

//判斷是否為空 (BOOL)IsStringEmptyOrNull:(NSString *)str { if (!str) { // null object return true; }else if (str nil){ return true; }else { if ([str isKindOfClass:[NSNull class]]) { return true; …

VS項目屬性的一些配置項的總結(持續增加。。。)

首先&#xff0c;解決方案和項目文件夾包含關系(c項目)&#xff1a; VS解決方案和各個項目文件夾以及解決方案和各個項目對應的配置文件包含關系&#xff1a;假設新建一個項目ssyy&#xff0c;解決方案起名fangan&#xff0c;注意解決方案包括項目&#xff0c;此時生成的最外層…

shell編程中date用法(轉)

原文地址:http://blog.sina.com.cn/s/blog_61c006ea0100mgxe.html 1、date --help %% 輸出%符號 a literal % %a 當前域的星期縮寫 locale’s abbreviated weekday name (Sun..Sat) %A 當前域的星期全寫 locale’s full weekday name, variable length (Sunday..Saturday) %b 當…

linux下搭建FTP服務器

LINUX FTP簡單配置 FTP配置1、#vi /etc/vsftp/vsftpd.conf #主要配置幾個關鍵的就可以 anonymous_enableNO #拒絕匿名訪問 chroot_local_userYES #鎖定用戶目錄&#xff0c…