寓言故事
测绘队建了一座不用每次丈量全境的索引台
边境测绘队每年要处理几十万张地形采样图。每来一份新的地貌报告,老规矩是把它和之前所有报告逐一比对,看看有没有类似的丘陵、河谷和隘口。
报告越积越多,比对一次从一杯茶的工夫变成半天。前线急等结果,后方还在翻旧图。队长说加人,于是一个测绘室坐了二十个人,人手一叠图,各自比。
更麻烦的是,新报告往往不要求精确一致。指挥官问:'附近有没有和这片林子差不多的地形?'差个几十米没关系,大致相似就行。可逐一比对的方法是按精确距离算的,每份旧图都要跑一遍全量计算。
队里一个年轻测绘员做过数值分析。他注意到,全境比对之所以慢,不是单次计算重,而是每次都要把所有旧报告重新加载、重新排序。如果提前把旧报告按地形特征编成一套索引,新查询进来只用在索引里找最接近的一簇。
他先用一种压缩编码把每份旧报告的地形特征压成短码,然后按编码相似度把报告分到不同的桶里。查询时,先算新报告的编码,找到对应的桶,只在桶里比。桶外的不用看。
第一版只分桶,准确度还行但偶尔漏掉边缘报告。他又加了一层:除了同桶内比对,还要看一下相邻桶。相邻桶里的报告也可能足够接近,只是编码时刚好踩在分界线附近。
他进一步把压缩编码做到极致:每份报告的地形特征从几百个数字压成几十个数字,搜索时先比压缩码,只有压缩码相近的少数几份才解压完整比对。
后来这套索引台被做成一个随时可调用的工具箱。队里可以自己选压缩精度和分桶粗细;在准确度、速度和内存之间调整,不需要每次从头读报告。测绘队长终于把全量比对的规矩撤了:比对的灵魂不是保证看到每一份,而是用最小的力气找到最对的那几份。后来测绘队把这套索引台教给新兵。新兵最容易犯的错,是把快当成唯一目标,桶分得太粗,结果相似山谷被漏掉;或把精确当成唯一目标,桶分得太细,又退回慢查旧路。队长要求他们按战事调整:急报先要快,边境选址要更准。索引的好坏,取决于速度、空间和误差之间的取舍。