网站首页 > 基础教程 正文
码农界有古话(好吧,没那么古),"编程即算法",还有一句话,"数据结构即算法",不对,没有这句话。哦,好把是虫虫搞错了。应该是"数据结和算法",我承认我为了作强调数据结构的重要性偷换了下概念,实际上对于一个开发者来说实际中遇到最重要的算法问题都是数据结构的问题。
作为一名软件开发人员,如何理解和实现数据结构来解决实际中遇到的问题,直接反映一个开发人员能力高低。
数据机构也能帮助我们理解许多复杂的核心CS概念,包括OS,网络和分布式系统等,比如Linux的进程管理归根到语言层都是一个个的数据结构哈希链表:
基本上我们现在都不会也无需从零开始编写算法。总是可以找到大量经过优化和测试的库可供使用,比如C++中的Boost,go-datastructures等。
本文中虫虫会给大家价绍一个数据结构可视化库Dataviz,通过对其图形化,帮助我们更好的理解golang的各种数据结构。
Dataviz简介
Dataviz是一个数据结构可视化库,通过对 Graphviz的可视化功能用golang来重新打包,已实现在golang中实现基本数据结构的可视化。它还提供示大量的实例来帮助我们学习和数据结构的可视化。
那么让我们从简单例子,堆来开始:
堆(heap)
现在,关于堆数据结构如何工作,需要花费很多时间,而且也偏离本文的主题。所以对于那些希望更仔细了解堆的人,请自己百度。基本上,堆支持O(LogN)插入和O(LogN)删除以及O(1)搜索性能。
现在,让我们直接利用Dataviz来构建一个堆:
package main
import (
bheap "github/Arafatk/dataviz/trees/binaryheap"
)
func main() {
heap := bheap.NewWithIntComparator()
heap.Push(3)
heap.Push(19)
heap.Push(17)
heap.Push(2)
heap.Push(7)
heap.Push(1)
heap.Push(26)
heap.Push(35)
heap.Visualizer("heap.png")
}
这个函数输出一个简单的png文件,显示了可视化的堆。
利用Dataviz可视化另一个好处是,不仅可以展示数据结构的当前状态,还可以动态显示数据结构中节点的增长和减少的过程。比如,如果我们从上面的不停的pop元素直到为空,这个过程用可以生成一个gif:
注意,Dataviz支持所有类型的标准堆操作,例如push,pop,empty,clear,size,top以及其他操作,比如逆向操作函数等。
让我们看看一个相对复杂一点的数据结构,红黑树。
红黑树
红黑树的真正优势在于支持在O(logN)情况下进行插入,删除和搜索。让我们编码来实现如何将几个数字映射到几个字符以及如何将其可视化。
package main
import (
rbt "github/Arafatk/dataviz/trees/redblacktree"
)
func main() {
tree := rbt.NewWithIntComparator()
tree.Put(5, "e")
tree.Put(6, "f")
tree.Put(7, "g")
tree.Put(3, "c")
tree.Put(4, "d")
tree.Put(1, "x")
tree.Put(2, "b")
tree.Put(1, "a") //overwrite
tree.Visualizer("out.png")
}
这会生成如下的一张图out.png:
我们还可以了解如何逐步构建并查看每个红黑树如何通过添加新节点来构建。
注意红黑树的基本属性:
1、每个节点都有一个颜色属性,每个节点或是红的或是黑的
2、根节点必须是黑的
3、每个叶子节点(nil节点)为黑
4、如果一个节点为红的,那么它的两个孩子都是黑的
5、每个节点到它子孙叶子节点的路径上的黑色节点个数是相同的
下面的gif展示了逐步构建红黑树的过程。注意上以上规则如何实现的:
利用dataviz还可以做得其他有意义的事情:构建栈,AVL树,Btrees及更多的事情
使用DataViz构建栈(Stack)
使用Dataviz构建B树
好了,今天的内容就介绍完了,请关注虫虫一起学习。
猜你喜欢
- 2024-10-19 盘点数据结构的应用场景 数据结构主要研究什么应用问题中的数据
- 2024-10-19 c++之stl底层数据结构 c++stl库详解教程
- 2024-10-19 C语言数据结构实现:迷宫问题的通用解法
- 2024-10-19 C/C++编程笔记:数据结构二叉树查找前序、中序、后序、层序遍历
- 2024-10-19 当 Java 遇上 C++: 使用 JNA 传递复杂数据结构
- 2024-10-19 C++并发编程实战:基于锁的并发数据结构
- 2024-10-19 《大话数据结构》C++实现二叉平衡树的建立
- 2024-10-19 《大话数据结构》C++实现七大排序算法详细代码
- 2024-10-19 数据结构(C++版)邓俊辉 学习笔记——第一章要点摘录
- 2024-10-19 C++ Qt面试题24:常用数据结构有哪些?
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)