數據結構和算法
數據結構和算法(DSA)是計算機科學中最重要的主題之一,每個CS學生都必須精通,甚至非CS學生也必須對其有基本的了解。據說DSA就像麵包和黃油一樣,是CS的必要性。這個存儲庫是為那些渴望學習並想實現數據結構和算法的那些學生(像我一樣?)的。
為什麼要去/golang而不是C,C ++或Java?
我不會不同意C,C ++或Java並不是一種實現DSA的好語言,因為人們必須在編寫諸如內存分配和適當的處理之類的代碼時照顧很多東西,並且這樣做可以學到很多東西。
但是,GO也將是實現DSA的好語言的原因是它缺乏很多魔術。沒有操作員過載,因此無法隱藏額外的複雜性。索引操作為o(1),循環是o(n) - 始終。沒有仿製藥,因此許多額外的抽象和助手不存在,這實際上很棒。沒有懶惰或其他編譯器驅動的魔法可以顯著改變算法的運行時。 GO具有用於切片的指針和低級原語,這意味著當數據包裝或數據具有額外的間接時,這很明顯。簡而言之:從代碼中使實際算法執行顯而易見,這是學習算法是一件好事。
結論:GO也將是一種開始實施數據結構和算法的好語言。
指示
- 要開始,請確保您在計算機上安裝了編程語言。請關注如何從Golang下載說明中安裝說明。
- GO安裝在計算機上後,只需克隆或下載此存儲庫即可。
- 現在,
cd <folder-name>進入要運行的文件所在的文件夾。 - 現在運行
go run . 。
例子
讓我們假設您要運行位於graphs/directed_unweighted目錄中的文件,然後運行的語法將是:
cd graphs/directed_unweighted/
go run .
文件夾名稱
- 演算法-
- 01knapsack_dp -0-1使用動態編程
- A_STAR-
- 8_puzzle-使用*算法的8個拼圖問題
- directed_graph- a *算法用於有向圖
- Undirected_graph-無向圖的A *算法
- Activity_Selection_gp-使用貪婪編程的活動選擇
- assembly_line_scheduling-使用動態編程的彙編線計划算法
- binary_reflected_gray_codes-二進制反射的灰色代碼
- kersest_pair_problem-
- cpp_brute_force-使用蠻力技術最近的一對問題
- CPP_DIVIDE_CONQUER-使用Divide和Conquer Techinque最近的一對問題
- 組合-
- convex_hull-
- CH_BRUTE_FORCE-使用Brute Force Technique凸出船體算法
- CH_DIVIDE_CONQUER-使用Divide和Conquer Technique凸出船體算法
- expression_conversions-
- Infix_postFix -FostFix Conversion ifix
- infix_prefix-前綴轉換的符號
- Postfix_infix- infix轉換的後綴
- Postfix_prefix-前綴轉換的後綴
- prefix_infix- ifix轉換的前綴
- prefix_postfix-後綴轉換的前綴
- GCD-最大的常見除數(Euclid的算法)
- 圖-
- articulation_point_detection-檢測無方向圖中的關節點
- Bellman_ford -Bellman Ford算法
- 橋_DETECTION-橋樑檢測/切割邊緣檢測無方向的圖
- Dijkstra -Dijkstra的算法
- Floyd_warshall -Floyd Warshall算法(所有點最短路徑)
- Kruskals -Kruskal的算法(使用貪婪的方法找到最小跨越樹的MST)
- PRIMS- PRIM的算法(使用貪婪的方法找到最小跨越樹的MST)
- 拓撲_sort-拓撲排序
- 遍歷-
- cd_directed_graph_traversals-使用遍歷技術在有向圖中的循環檢測
- cd_undirected_graph_traversals-使用遍歷技術在無向圖中的循環檢測
- TSP-
- tsp_dynamic-
- directed_graph -TSP(旅行推銷員問題)使用動態方法用於有向圖
- Undirected_graph -TSP(旅行推銷員問題)使用動態方法無方向圖
- tsp_naive-
- directed_graph -TSP(旅行推銷員問題)使用幼稚的方法
- Undirected_graph -TSP(旅行推銷員問題)使用幼稚的方法進行無向圖
- Union_find-聯合查找 /分離集(檢測無方向圖中的周期)
- Huffman_codes- Huffman代碼(生成Huffman代碼)
- JOB_SCHEDULING_GP-使用貪婪編程的作業計划算法
- LCM-最少常見的倍數(使用GCD Euclid的算法)
- LCS-最長的常見子序列
- iterative_dp-使用動態編程(迭代版本)的最長常見子序列
- lo_permutations-詞典訂購排列
- 最長_palindrome_substring-
- Brute_force-使用蠻力技術最長的回文底弦
- Manchers-使用Mancher的算法最長的回文底弦
- make_change_dp-使用動態編程進行更改問題
- order_statistics-查找KTH最小/最大元素(順序統計)
- Naive_Apprace-使用Max Heap -O(K +(NK)*LOG(K))的幼稚方法
- quick_select-快速選擇(快速排序) - o(n^2),θ(nlogn)
- worst_case_linear_time-最差的情況線性時間順序統計 - o(n)
- power_set-電源集(子集集)
- 搜尋-
- binary_search-二進制搜索 - o(log n)
- Interpolation_search-插值搜索 - o(n)
- Linear_search-線性搜索-O(n)
- ternary_search-三元搜索 - o(log 3 n)
- sieve_of_eratosthenes- eRatosthenes的篩(連續數量不超過n)
- 排序-
- binary_insertion_sort-二進制插入排序-O(n 2 )
- bubble_sort-泡泡排序-O(n 2 )
- bucket_sort-桶排序-O(n 2 )
- counting_sort-計數排序 - o(n + k)
- HAEP_SORT-堆排序-O(nlog(n)
- insertion_sort-插入排序-O(n 2 )
- Merge_sort-合併排序-O(nlog(n))
- quick_sort-快速排序 - θ(nlog(n))
- RADIX_SORT -RADIX排序-O(N+K)
- Selection_Sort-選擇排序 - (O(n 2 ))
- shell_sort-外殼排序 - (n)
- string_matching-
- boyer_moore-博耶·摩爾算法
- Horspool -Boyer Moore Horspool算法
- knuth_morris_pratt -Knuth Morris Pratt
- naive_pattern_matching-幼稚的模式匹配
- Rabin_karp-拉賓·卡普( Rabin Karp)
- Toh-河內塔
- 圖-
- 定向_unweighted-定向未加權圖
- 定向_weighted-定向加權圖
- 無方向性- 未指向的未加權圖
- 無方向性- 無向加權圖
- 堆-
- max_binary_heap-最大二進制堆
- min_binary_heap-最小二進制堆
- linked_lists-
- circular_doubly_ll-圓形雙鏈接列表
- circular_ll-循環鏈接列表
- doubly_ll-雙重鏈接列表
- PRES_REV_SINGLE_LL-在單個鏈接列表上插入時保存訂單,並逆轉單個鏈接列表
- 單_ll-單鏈接列表
- 隊列-
- cdqueue-圓形雙端隊列
- cqueue-圓形隊列
- dqueue-雙端隊列
- Priority_queue-使用最小堆的優先隊列
- Simple_queue-簡單隊列
- 堆棧- 堆棧
- 樹木-
- AVL_TREE_USED_LL-使用帶有BFS和DFS(pre,in,post)訂單遍歷的鏈接列表的AVL樹。
- bst_using_arr-使用BFS和DFS(pre,in,post)順序遍歷的數組使用數組。
- bst_using_ll-使用帶有bfs和dfs(pre,in,post)順序遍歷的鏈接列表的二進制搜索樹。
- simple_bt_using_arr-使用帶有BFS和DFS(pre,in,post)順序遍歷的數組的簡單二進制樹。
- Simple_bt_using_ll-使用帶有BFS和DFS(pre,in,post)訂單遍歷的鏈接列表的簡單二進制樹。
注意:指針“:point_left:”表示不完整的實現,並且在待辦事項列表中。
貢獻
該存儲庫是為了學習如何實現數據結構和算法,並且由於他人的貢獻不會真正教我如何自己實施它,因此我不會接受任何拉動請求。但是,請隨意分配此存儲庫,並修改代碼以圍繞各種數據結構和算法播放。此外,在圍繞代碼播放時,如果您在插入中發現任何異常或錯誤的內容,如果您在同一問題上創建問題,我將非常感謝。
執照
該存儲庫是根據MIT許可發布的。簡而言之,這意味著您可以在任何個人,開源或商業項目中自由使用此軟件。歸因是可選的,但值得讚賞。
HAPPY CODING
HAPPY LEARNING