16.1.链表和哈希表和二叉树和图
(1)在嵌入式开发中链表是使用最频繁的,哈希表只在内核中的部分地方使用,二叉树和图几乎没有使用。
(2)所以在嵌入式开发中链表是最重要的,链表在linux内核中使用非常多,驱动和应用编写很多时候都需要使用链表。所以对链表必须掌握:会自己定义结构体来实现链表、会写链表的节点插入(前插、后插)、节点删除、节点查找、节点遍历等。至于像逆序这些很少用,掌握了前面那几个这个也不难。
(3)哈希表不是很常用,一般不需要自己编写而是直接使用别人实现的哈希表比较多。对我们来说最重要的是要明白哈希表的原理,从而知道哈希表的特点,从而知道什么时候该用哈希表,当看到别人使用了哈希表的时候要明白别人为什么使用哈希表、合不合适、有木有更好的选择。
(4)二叉树、图等。对于这些复杂数据结构,不要太当回事。这些复杂数据结构用到的概率很小(在嵌入式开发中),其实这些数据结构被发明出来就是为了解决特定问题的,你不处理特定问题根本用不到这些,没必要去研究。
16.2.数据结构和算法
(1)因为现实的实际问题时多种多样的,问题的复杂度不同,所有需要解决问题的算法和数据结构也不同。所以当我们处理什么复杂度的问题,就去研究针对性解决的数据结构和算法。当我们木有碰到此类问题或者工作领域与无关,则就可以不理它。
(2)每个数据结构的发明都是为了配合一定的算法;算法是为了处理具体问题,算法的实现依赖于相应的数据结构。当前我们所指的算法和纯数学不同,因为计算机算法要求以数学算法为指导,并且结合计算机本身的特点来改进,最终使用代码实现一个可以在计算机上运行的算法。
16.3.如何学习数据结构和算法
(1)数据结构和算法是相辅相成的,需要一起研究。
(2)数据结构和算法对嵌入式来说不全是重点,不要盲目的跑去研究。
(3)一般在实际应用中,实现数据结构和算法的人和使用数据结构和算法的人是分开的。实际中有一部分人的工作就是研究数据结构和算法,并且试图用代码来实现这些算法(表现为库);其他做真正工作的人要做的就是理解、明白这些算法和数据结构的意义、优劣、特征,然后在合适的时候选择合适的数据结构和算法来解决自己碰到的实际问题。
(4)譬如:linux内核在字符设备驱动管理时,使用了哈希表(hash table,散列表)。所以字符设备驱动的很多特点都和哈希表的特点有关。