• 小橙书阅读指南(一)——二分查找法


    适用场景:当需要在大量有序数据中查找的时候,推荐使用二分查找法(BinarySearch)。

    下图演示的是在有序数组[10,11,12,16,18,23,29,33,48,54,57,68,77,84,98]中命中23和未命中50的情况:

    Java代码示例:

    import java.io.*;
    
    public class BinarySearch {
        public static boolean rank(int target, int[] arr) {
            // 数组下标
            int lo = 0;
            int hi = arr.length - 1;
            while (lo <= hi) {
                int mid = lo + (hi - lo) / 2;
                if (target < arr[mid]) {
                    hi = mid - 1;
                } else if (target > arr[mid]) {
                    lo = mid + 1;
                } else {
                    return true;
                }
            }
            return false;
        }
    
        public static void main(String[] args) throws IOException {
            BufferedReader reader = new BufferedReader(new FileReader("whitelist.txt"));
            int[] whitelist = new int[1000000];
            String temp;
            int i = 0;
            while ((temp = reader.readLine()) != null) {
                whitelist[i++] = Integer.valueOf(temp);
            }
    
            reader = new BufferedReader(new FileReader("goallist.txt"));
            int[] targetlist = new int[100000];
            i = 0;
            while ((temp = reader.readLine()) != null) {
                targetlist[i++] = Integer.valueOf(temp);
            }
            int sum = 0;
            long start = System.currentTimeMillis();
            for (int j = 0; j < targetlist.length; ++j) {
                if(BinarySearch.rank(targetlist[j], whitelist)) {
                    sum++;
                }
            }
            long end = System.currentTimeMillis();
            System.out.println(sum);
            System.out.println(end - start);
        }
    }

    Qt/C++代码示例:

    #include <QtCore/QCoreApplication>
    #include <QDebug>
    #include <QFile>
    #include <QTime>
    
    bool rank(int target, int *arr, int len) {
        int lo = 0;
        int hi = len;
    
        while (lo <= hi) {
            int mid = lo + (hi - lo) / 2;
            if (target < arr[mid]) {
                hi = mid - 1;
            }
            else if (target > arr[mid]) {
                lo = mid + 1;
            }
            else {
                return true;
            }
        }
        return false;
    }
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
        // 1000 * 1000 * 4byte = 4MB 必须声明在堆上
        int *whiteArr = new int[1000000];
        int *goalArr = new int[100000];
        QFile whitefile("whitelist.txt");
        int i = 0;
    
        if (whitefile.open(QIODevice::ReadOnly | QIODevice::Text)) {
    
            while (!whitefile.atEnd()) {
                QByteArray line = whitefile.readLine();
                QString s(line);
                whiteArr[i++] = s.toInt();
            }
            whitefile.close();
        }
    
        QFile goalfile("goallist.txt");
        i = 0;
        if (goalfile.open(QIODevice::ReadOnly | QIODevice::Text)) {
            while (!goalfile.atEnd()) {
                QByteArray line = goalfile.readLine();
                QString s(line);
                goalArr[i++] = s.toInt();
            }
    
            goalfile.close();
        }
        int sum = 0;
        QTime rt;
        rt.start();
        for (int j = 0; j < 100000; ++j) {
            if (rank(goalArr[j], whiteArr, 1000000)) {
                sum++;
            }
        }
        int el = rt.elapsed();
        qDebug() << sum;
        qDebug() << el;
        return a.exec();
    }

     相关附件:

    whitelist.txt
    goallist.txt

  • 相关阅读:
    权限管理(java+struts2(自定义标签)实现)--------->全代码演示
    颜色的几个术语和属性
    颜色的不同表达方式
    bootstrap作为mixin库的应用模式
    -webkit-min-device-pixel-ratio: 2是什么意思?
    如何在前端项目中引用bootstrap less?
    js闭包??
    win 运行
    win 2016 添加系统组件注册表,
    C# window服务操作
  • 原文地址:https://www.cnblogs.com/learnhow/p/9457832.html
Copyright © 2020-2023  润新知