原文發表于鳳凰花論壇:http://www.fenghuanghua.com/bbs/viewthread.php?tid=34&extra=page%3D1 有興趣的朋友可以在那里討論。 純真數據庫是國內用的最多的ip-地理信息數據庫,雖然不怎么專業,但是數據蠻全的,數據結構也比較合理。
關于純真數據庫的數據結構,可以看一下lumaqq的文檔,里面有一點說的不太清楚,就是里面的ip和地理信息不是一對一,是多對一,所以ip一般是ip段。查詢的時候是查詢ip地址落在哪個段。
純真數據庫的查詢算法也已經有人實現了:http://www.companysz.com/article/2008/4055.shtml
用的是線性表的二分查詢。
純真數據庫比較大,大約有60萬的記錄,上面的算法基本上可以接受了,平均查詢效率在2ms左右,對于單機程序,完全可以忽略,但是對于并發比較大的系統,比如統計系統,這樣的效率還不夠。
既然數據是線性存儲的,那么就可以采用分段查詢,預先將數據隔成段,查詢時,先找到相應的段,然后進行二分查詢。
二分查詢的平均查找長度是:lg(n+1)-1
那么分塊詢找+二分查詢的平均查找長度就是:(設塊數為N)分塊也進行二分查找,所以查找塊的平均長度是lg(N+1)-1,每塊長度是n/N ,所以最終長度是:lg(N+1)-1 + lg(n/N+1)-1
根據上面的公式,代入n可以算出一個最佳塊數N,也就是最佳查詢時間了。數據量越大,查詢速度越快,數據量比較小的表就沒必要分塊了。
我高數學得不好,不知道對不對。請大蝦指正,另外幫忙算一下6249322條數據的最佳塊數。
修改后的代碼如下:(function separate($count)是我添加的分塊函數,if($separator){}所在部分是二分查找塊)
<?php
/**
* IP 地理位置查詢類
* 增加分塊查詢算法
*
* @author 馬秉堯
* @version 1.5
* @copyright 2005 CoolCode.CN
* @modified by david blog:blog.iyi.cn bbs:www.fenghuanghua.com
*/
class IpLocation {
/**
* QQWry.Dat文件指針
*
* @var resource
*/
var $fp;
/**
* 第一條IP記錄的偏移地址
*
* @var int
*/
var $firstip;
/**
* 最后一條IP記錄的偏移地址
*
* @var int
*/
var $lastip;
/**
* IP記錄的總條數(不包含版本信息記錄)
*
* @var int
*/
var $totalip;
/**
* 返回讀取的長整型數
*
* @access private
* @return int
*/
function getlong() {
//將讀取的little-endian編碼的4個字節轉化為長整型數
$result = unpack('Vlong', fread($this->fp, 4));
return $result['long'];
}
/**
* 返回讀取的3個字節的長整型數
*
* @access private
* @return int
*/
function getlong3() {
//將讀取的little-endian編碼的3個字節轉化為長整型數
$result = unpack('Vlong', fread($this->fp, 3).chr(0));
return $result['long'];
}
/**
* 返回壓縮后可進行比較的IP地址
*
* @access private
* @param string $ip
* @return string
*/
function packip($ip) {
// 將IP地址轉化為長整型數,如果在PHP5中,IP地址錯誤,則返回False,
// 這時intval將Flase轉化為整數-1,之后壓縮成big-endian編碼的字符串
return pack('N', intval($ip));
}
/**
* 返回讀取的字符串
*
* @access private
* @param string $data
* @return string
*/
function getstring($data = "") {
while (ord($char = fread($this->fp, 1)) > 0) { // 字符串按照C格式保存,以 主站蜘蛛池模板: 在线天堂中文在线资源网 | 羞羞网站视频 | xxxx69hd一hd72 | 亚洲第一色片 | 成人在线观看一区 | 视频在线色 | 国产精品99久久久久久久vr | 九草网 | 高清视频一区二区 | 香蕉国产在线视频 | 黄色毛片免费看 | 成年性羞羞视频免费观看 | 久久久一区二区三区精品 | 国产人成免费爽爽爽视频 | gogo全球大胆高清人露出91 | 久久综合av| av在线免费观看中文字幕 | www国产成人免费观看视频,深夜成人网 | 久草在线高清 | 国产一级毛片a | 免费播放av| 欧美自拍三区 | 免费网址黄 | 色欧美视频 | 欧美精品亚洲人成在线观看 | 草操视频 | av在线日韩 | 91在线视频观看 | 亚洲国产网址 | 欧美一区二区三区中文字幕 | 久久久久久久久国产精品 | 日日噜噜噜夜夜狠狠久久蜜桃 | 九色新网址 | 亚洲乱搞 | 成人国产在线看 | 久草在线高清 | av电影在线观看网址 | china对白普通话xxxx | 日韩黄色免费电影 | 国产理论视频在线观看 | 国产91久久精品一区二区 |