一、顺序查找(线性查找)
从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表结尾也没找到。
它属于暴力查找技巧的一种。
例1:查找数组里有无某元素
如果在数组中找到了data,函数立刻返回true,后面不执行;如果直到数组结尾也没找到data,函数返回false。
例2:返回匹配元素位置
如果没有找到要找的数据,返回-1,由于没有元素存储在-1的位置,所以这个返回值很赞。
1.1 查找最小值和最大值
原理:
(1)将数组第一个元素赋值给一个变量,把这个变量作为最小值;
(2)开始遍历数组,从第二个元素开始依次同当前最小值进行比较。
(3) 如果当前元素数值小于当前最小值,则将当前元素设置为新的最小值。
(4)移动到下一个元素,并且重复步骤3。
(5) 当程序结束时,这个变量中存储的就是最小值。
例3:查找最小值
需要注意的关键点是由于我们假设数组的第一个元素就是当前的最小值,所以这个函数会从数组的第二个元素开始处理,即var i = 1。
例3:查找最大值
1.2 使用自组织数据
对于未排序的数据来说,当被查找的数据位于数据集的起始位置时,查找是最快、最成功的。通过将成功找到的元素置于数据集的起始位置,可以保证在以后的操作中该元素能被更快的找到。
该策略背后的理论是:通过将频繁找到的元素置于数据集的起始位置来最小化查找次数。
数据的位置并非由程序员在执行之前就组织好,而是在程序运行过程中由程序自动组织的。
使用这个方法之后,查找最频繁的元素最终会移动到数据集的起始位置,类似于对数据进行排序时用的冒泡排序。同时,也可以保证已经在数据集前面的元素不会被越移越远。
以上是对未排序数据的查找。如果先排序,则会显著加快对大数据集的查找。
二、二分查找算法
算法描述如下:
(1)将数组的第一个位置设置为边界(0)。
(2)将数组最后一个元素所在的位置设置为上边界(数组长度-1)。
(3)若下边界小于等于上边界,则做如下操作。
a. 将终点设置为(上边界 + 下边界)/ 2。
b. 如果查询值小于中点,将下边界设为中点下标 -1。
c. 如果查询值大于中点,将上边界设为中点下标 +1。
d. 否则中点元素即为要查找数据,return。
注意,当binSearch()函数找到某个值时,如果数据集中还有其他相同值,比如要找37,数据集中有3个37,则返回的一定是中间那个37。
计算查找到的目标值在数据集重复次数:
统计重复值的函数最简单的方法是写两个循环,两个都同时对数据集向下遍历,或向左遍历,统计重复次数;然后向上或向右遍历,统计重复次数。