顺序查找
从列表第一个开始对列表逐个查找, 暴力查找了属于是。
function seqSearch(arr, data) {
for(var i = 0; i< arr.length; i++) {
if(arr[i] == data) {
return true
// return i
}
}
return false
// return -1
}
查找最小值和最大值
function gitMin(arr) {
var temp = arr[0]
for (var i = 1; i < arr.length; i++) {
if (temp < arr[i]) {
temp = arr[i]
}
}
return temp
}
function gitMax(arr) {
var temp = arr[0]
for (var i = 1; i < arr.length; i++) {
if (temp > arr[i]) {
temp = arr[i]
}
}
return temp
}
使用自组织数据
对于未被排序的数据集来说,当被查找的数据位于数据集的起始位置时,查找最快。通过将成功找到的元素至于数据集的起始位置,可以保证在以后的操作中该元素能被更快的找到。
如果你是个图书馆管理员,一天之内好几次被问到同一本书,你就应该将他处于一个明显的位置一边查找。这就时自组织数据的例子。
80-20原则
对一个数据集执行80%的查找操作都是对其中20%数据进行的。另外20%操作负责查询其他80%的数据。
// 自组织数据
function seqSearch(arr, data) {
for(var i = 0; i< arr.length; i++) {
if(arr[i] == data) {
if(i > 0) {
swap(arr, i, i-1)
}
return true
}
}
return false
}
function swap(arr, index, index1) {
var temp = arr[index]
arr[index] = arr[index1]
arr[index1] = temp
}
二分法算法
function binSearch(arr, data) {
var upperBound = arr.length - 1
var lowerBound = 0
while (lowerBound <= upperBound) {
var mid = Math.floor((upperBound + lowerBound) / 2)
if (arr[mid] < data) {
lowerBound = mid + 1
} else if (arr[mid] > data) {
upperBound = mid - 1
}
}
return -1
}
查找文本数据
通过solit() 将字符串分割为数组,然后循环匹配
比较暴力搜索和二分法搜索的速度
readFile(path.join(__dirname, 'words.txt'), 'utf-8', function (err, data) {
if (err) return console.log('读取文件失败:' + err.message)
console.log('读取文件成功,内容是' + data)
var words = data
var word = 'guohua'
var start = new Date().getTime()
var position1 = seqSearch(words, word)
var stop = new Date().getTime()
var elapsed = stop - start
if (position1 >= 0) {
console.log( position1, elapsed )
}
var sort = words.sort(function() {return 1})
var position2 = binSearch(words, word)
var start = new Date().getTime()
var stop = new Date().getTime()
var elapsed = stop - start
if (position2 >= 0) {
console.log( position2, elapsed )
}
})