13.检索

233 阅读1分钟

顺序查找

从列表第一个开始对列表逐个查找, 暴力查找了属于是。

    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 )
        }
    })