查找:线性结构

       在数据结构中,查找是一大知识点,并且在最近的leetcode刷题的时候,也会经常遇到这种查找的问题,比如子串查找这类问题。查找的方式有很多,这篇主要是记录一下查找中最简单也是最常用的线性结构的查找方式,主要分为三种,顺序查找、折半查找、分块查找。

顺序查找

       顺序查找,最简单的查找方式,也是我们惯有的思维,就是一个一个的比较,然后找相应的元素。这种最简单的方式自然有很大的缺点,就是查找效率很低,如果要查找的数在最后一个,那么查找等于遍历,但是在没有其他好办法的情况。这也是一种解题思路,并不能因为简单,效率低就否定这种解题方法。但是他有一个优势,就是对要查找的数据元素的存储没有要求,并且对元素的有序性也没有任何要求,这就没有额外的开销。当然在有序表中查找和一般线表中查找,个人感觉没什么区别,都是一样的依次比较,并且在有序顺序表中使用折半更好。

 

 折半查找

       折半查找,如果数据元素有序,那么与最中间的元素进行比较,如果大了,再把最中间的元素当成第一个元素,再取中间的元素,如果小了,那么把中间的元素当成最后一个元素。在很多有序的情况下也是会被用到的,当然前提是有序,如果数据元素都不具备有序性,那么强行使用折半查找的话,就会额外的排序开销,如此一来,折半查找的效率不如其他的查找方法,不过在有序的情况,折半查找非常好用。我在leetcode写的几题,虽然空间占用大了点,但是速度都是百分之百。折半查找在写的时候需要注意很多,尤其是数的索引,这种细节最容易出错,之后在leetcode中再补充其中的索引细节。最终如果图像表示的话,很像二叉顺序树

 

 分块查找

       分块查找,是将上面的俩种方法合并起来,将数据组合成一块一块,块间是有序的,块内是无序的,在查找的时候,只要利用块间的有序来找到哪块,也就是数的范围,然后在这一块中依次顺序查找。但是这种方法应该只应用于特定场合中,我很长时间都没有接触过这种方法。不过这种先找出范围,再从这种范围中找到所需要的数据,感觉也有点像B树的查找了。

 

       总之这三种查找方法,在题目,只有折半在特定情况下会使用到。顺序查找虽然思路简单,但是多数情况下效率太低,很难用到。分块查找个人感觉只有在特定的场合中才会用到。在查找题目中,比如查找字符串的回文字中使用的是马拉车算法,还有查找最大容量使用的是双指针法等等。这些都不会用到以上的算法,但是仍然需要记录一下。 

posted @ 2020-07-02 08:47  长安不乱  阅读(225)  评论(0编辑  收藏  举报