学习经验数据结构

我学习数据结构已经有一小段时间啦,大概是从大一暑假开始的,个人平时是比较喜欢coding的,磕磕绊绊走了一些弯路,但是也获得了一些回报,去年跟着小伙伴一起组队参加ACM比赛,获得亚洲区域赛北京和青岛站的铜牌,今天跟小伙伴们交流一下学习的过程中的一些经历还有个人的一些小建议~大家有什么问题也可以留言与我讨论~

我个人认为,学习某种数据结构,可以分为这么几个阶段:在纸上画出这种数据结构、能按照书上的方法用代码实现、能熟练的用各种方法实现、能在实践中运用。接下来,我想和大家聊一聊这么几个阶段~

1.在纸上画

如果我们对一种数据结构完全不明白,这时我们想学习它,那么我们肯定应该先理解它的概念,可以通过很多的途径去了解它,比如看书,看博客。看完之后,我们就对这种结构有了基本的理解,这时,想要直接用代码实现恐怕有一些难度,我们可以先在纸上画。在纸上画出来可以加深我们对这种结构的理解,因为数据结构毕竟比较抽象,能画出来的话,说明我们对它已经有了一定的了解。这时,可以考虑用代码去实现,在实现的过程中,有思路比较模糊的地方,可以继续在纸把流程画一下,这样思路会比较清晰一些。

2.照着书用代码实现

当我们对某种结构有了一定的了解之后,我们可以尝试着用代码实现,如果做不到自己独立实现的话(我就做不到。。。)

我认为可以先照着书上或是大神的博客上的方法实现一下,有句话说:"学习都是从模仿开始的嘛~"。书上的代码就是我们首先要去模仿的对象。当我们把书上的方法理解了,也实现了,这是我们可以进一步考虑,是不是还有别的更简单的方法来实现呢,书上的代码是不是还可以再简化一下呢。事实上,书上的代码,很多都是可以简化的,有可能是作者为了能让读者更好的理解,所以故意多写了几步,而且书上的方法不一定是最好的方法。毕竟尽信书不如无书~

3.熟练的用各种方法实现

到了这个阶段,我们应该尝试着抛开书上的较为传统的方法,我们根据自己的理解用自己的方法去实现数据结构。比如说,一棵树,除了书上的用指针来表示孩子,我们还有没有更简单的方法呢?比如这样一棵树

我们可以注意到,这是一棵多叉树,并且有些场景下,每个结点的孩子的数量还是动态变化的,这样的话,书上较为传统的方法似乎失去了效果,那么我们可以这样做,vectorinttree[],这样就可以表示一棵树,tree[x]表示的则是x的孩子,如果我要给x动态添加一个孩子y,这是非常好实现的,直接tree[x].push_back(y),这样,肯定比书上一些较为传统的方法要易于实现。

我们再来看一个例子,一个最多00个结点的图,我们要来存储这个图,该怎么做呢?

首先,因为这个图最多能有00个结点,肯定不能用邻接矩阵来存,肯定使用邻接表,那么邻接表怎么实现呢?很多书上是真的用了链表来实现,这种方法显然是非常难以实现的,还有的书上,用了几个数组来进行组合,用next数组来存下一条边的编号,这种方法肯定比上一种好得多。

但是,还能不能有更简单一些的实现呢?我们能不能用自己的方法实现邻接表呢?其实方法有很多,我们来看其中一种,用vector来简化的方法。

首先设计好边这个结构,包括起点,终点,权重

然后,用一个vector来存所有的边,另一个vector来存与x结点邻接的边的编号,这样,我们可以很简单的完成加边操作和遍历操作,具体可以这样实现

当然,这也只是众多实现方法中的一种,大家还可以根据实际碰到的问题,想出各种各样的方法来实现同一种数据结构,还有许许多多的例子,比如:用map实现树,用数组模拟链表。。。

每种数据结构,都只是一种抽象的概念,熟练了之后,我们可以根据自己的理解,想怎么实现就能怎么实现。

4.在实践中运用

我们实现了某种数据结构之后,还要能灵活的在实践中运用,这种实践可以是很多的方式,比如,最简单粗暴的,刷算法题呀….还有,自己做的小案例中的某个功能要用到哇,我们都可以试着将我们的所学去运用。

比如说,现在要做一个用户评论的功能,但是用户的评论中可能会有很多的不和谐的敏感词,那么,在文本很长,敏感词又很多的时候,我们如何设计一个为高效的算法,把这些敏感词过滤掉呢?

这个问题我们就可以用到字典树来解决,字典树处理文本查找问题有它天然的优势。我们可以把所有的敏感词建一棵字典树,然后用一个指针遍历用户的文本,一边遍历一边在树里比对,查到了敏感词就用星号替换。因为这是个多模式匹配问题,所以用字典树结构肯定是比kmp效率高很多很多的。具体我们来看一种实现。

这种实现显然也不是用传统的方法实现的,是用Map来实现的,它可以避免扫描每个结点的所有孩子结点,因为哈希表的查找是O(1)的复杂度,所以对于这个问题来说,这种实现方法比传统的方法更高效一些,那么有了这个结构,我们要设计一个敏感词过滤算法就非常简单。

这个例子同样也说明了上一个阶段的重要性,我们要能够根据不同的情况,自己设计数据结构的实现方法,而不是局限于书上的某种。

以上就是我对学习数据结构的一些感悟啦~最后再补一句,个人觉得多写多练才是最重要的,你所看到的所有的技巧都是基于代码量来说的,不要好高骛远,学会造轮子才能更好地去用。

文字:蓉姐姐

编辑:蓉姐姐

指导老师:李颖于杰









































白癜风能治好吗
白癜风能治好吗



转载请注明:http://www.92nongye.com/ksfc/ksfc/204621655.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了