好久没更,因为笔者前段时间处理了一些其他的问题,今天我们继续,走进《算法之美》第三章,数据结构。
同样,感兴趣的小伙伴不妨点点关注,等算法之没结束后,笔者将带大家开始机器学习的基础内容,敬请期待哦。
何为数据结构?我们为什么要了解数据结构?数据结构如何使用呢?
为了解决问题,许多技术人员都潜心钻研更优秀的算法高效地解决问题,但是,高效的算法往往需要精巧的数据结构与之配合,合适的数据结构才能将算法的优势发挥的淋漓尽致。
将数据进行合理的规划分配,偏于处理众多的数据,这就是数据结构的用处所在。
接下来,我们就走进数据结构,了解多种多样的数据结构各自的优势所在。
当我们需要将一些彼此相关的数据存储在空间中,为了方便管理,我们习惯性地偏向于将这些数据存储在一起,即连续的内存地址中,这样可以极大方便我们调用与修改,这就是数组的初衷。
在内存中,每当我们需要使用数组时,便会在内存中开辟出一块连续的内存空间,用于存放一系列数据。
代码如下:
# Alkaid#3529 def array_demo(): grade = array([[89, 70, 93], [70, 25, 80], [20, 40, 10]]) for i in grade: print(i)
将相关的数据存储在连续的内存地址当中,固然方便杜宇,但是,如果我们想要添加或删除一些数据,就会导致大量的数据移动,并且,连续存放不利于内存空间的充分使用,因此,在此基础上,我们创造了一种新的数据结构,链表。
链表,顾名思义,将许多节点相连,形成一条链。
每个节点分别存储当前结点的值,以及下一个节点在内存中的地址,这样子,我们只需记录第一个节点,依次寻找,即可找到全部数据。
这样的数据结构可以极大方便我们对数据的存储,充分利用内存空间。
代码如下:
# Alkaid#3529 class Node(object): def __init__(self, data=0, next=None): self._data = data self._next = next def set_data(self, data): self._data = data def get_data(self): return self._data def set_next(self, next): self._next = next def get_next(self): return self._next
栈是一种特殊的数据结构,它只能在一段进行操作,因此也就导致了所谓“先进后出”的特点,这种数据结构通常可以用来做代码中括号配对、表达式求值等运算。
代码如下:
# Alkaid#3529 def stack_demo(): """ 栈 利用列表的函数来实现类似于栈的功能,append(), :return: """ stack = [] for i in 'Alkaid#3529': stack.append(i) while stack: print(stack.pop()) return None
队列与栈类似,但是队列是一种可以两端操作的数据结构,一端只能进入,另一端只能输出,遵循先进先出的原则,我们可以利用Pycharm自带模块实现。
# Alkaid#3529 def queue_demo(): """ 队列 :return: """ s1 = "Alkaid#3529" name = Queue() for i in s1: name.put(i) while not name.empty(): print(name.get()) return None
树是一种较为高级的数据结构之一,它通过模拟树的形状来实现各个数据间的层级问题,可以更加直观方便的体现数据间的层次结构,方便查找、排序等操作。
典型的是二叉树结构,遍历方法分为先序、中序、后序、分层遍历。
此处就不对数进行更为深入的探讨了,后续会在相应的算法题目中进行实例使用。
图可以用于模拟大量数据间较为错综复杂的关系,分为有序、戊戌两种,可以用邻接表实现。
图的两种搜索方式与遍历方式也会在后续实例中为大家详细介绍(深度、广度搜索)。
数据结构与算法相辅相成,只需掌握常见的数据结构并熟练使用即可解决大多数算法问题。