数据结构和算法
数据结构和算法(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