提取出某日訪問百度次數最多的那個IP

2021-06-13 21:47:38 字數 1441 閱讀 2133

方法: 計數法

ip位址是32位的二進位制數,所以共有n=2^32=4g個不同的ip位址, 建立乙個unsigned count[n];的陣列,即可統計出每個ip的訪問次數,而sizeof(count) == 4g*4=16g, 遠遠超過了32位計算機所支援的記憶體大小,因此不能直接建立這個陣列.下面採用劃分法解決這個問題.

假設允許使用的記憶體是512m,  512m/4=128m 即512m記憶體可以統計128m個不同的ip位址的訪問次數.而n/128m =4g/128m = 32 ,所以只要把ip位址劃分成32個不同的區間,分別統計出每個區間中訪問次數最大的ip, 然後就可以計算出所有ip位址中訪問次數最大的ip了.

因為2^5=32, 所以可以把ip位址的最高5位作為區間編號, 剩下的27為作為區間內的值,建立32個臨時檔案,代表32個區間,把相同區間的ip位址儲存到同一的臨時檔案中.

例如:ip1=0x1f4e2342

ip1的高5位是id1  =  ip1 >>27 = 0x11 = 3

ip1的其餘27位是value1  =  ip1 &0x07ffffff = 0x074e2342

所以把 value1 儲存在t***檔案中.

由id1和value1可以還原成ip1, 即 ip1 =(id1<<27)|value1

按照上面的方法可以得到32個臨時檔案,每個臨時檔案中的ip位址的取值範圍屬於[0-128m),因此可以統計出每個ip位址的訪問次數.從而找到訪問次數最大的ip位址。

#include #include #include using namespace std;

#define n 32 //臨時檔案數

#define id(x) (x>>27) //x對應的檔案編號

#define value(x) (x&0x07ffffff) //x在檔案中儲存的值

#define make_ip(x,y) ((x<<27)|y) //由檔案編號和值得到ip位址.

#define mem_size 128*1024*1024 //需分配記憶體的大小為 mem_size*sizeof(unsigned)

char* data_path="d:/test/ip.dat"; //ip資料

//產生n個隨機ip位址

void make_data(const int& n)

{ ofstream out(data_path,ios::out|ios::binary);

srand((unsigned)(time(null)));

if (out)

{ for (int i=0; i

python百度文庫文字提取 百度文庫文字爬取

import requests import re import json headers 模擬手機 def get num url response requests.get url,headers headers text print response result re.search r md...

網路 socket 訪問百度

import viewcontroller.h import 沒注釋 import import inte ce viewcontroller property weak,nonatomic iboutlet uitextfield ipadress property weak,nonatomic ...

解題筆記(9) 提取某日訪問次數最多的那個IP

問題描述 從海量資料日誌中,提取出某日訪問次數最多的那個ip。思路 對於海量資料的處理,主要採取的策略就是分而治之,即縮減問題的規模,將乙個大的問題劃分成若干等價的小問題。然後解決這些小問題,最後將獲得的小問題解綜合起來,得出原問題的解。用到比較多的技術主要有雜湊 位圖 堆 trie樹 mapred...