100万个URL如何找到出现频率最高的前100个?

这个题是阿里的一个电话面试题,我想的头一个解决方案,有点限制,后面再写优化的

实验数据,python从百度抓得:

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

import urllib2
import re
import os

#connect to a URL
#一页的搜索结果中url大概是200个左右
file_url = open('url.txt','ab+')
#搜索框里的东西,这块可以设置成数字好让每次搜索的结果不一样
search = '123'
url = "http://www.baidu.com/s?wd="+search

def setUrlToFile():
    website = urllib2.urlopen(url)
    #read html code 

    html = website.read() 

    #use re.findall to get all the links 

    links = re.findall('"((http|ftp)s?://.*?)"', html)

    for s in links:
        print s[0]
        if len(s[0]) < 256:
            file_url.write(s[0]+'\r\n')

#收集实验数据
for i in range(0,50):
    setUrlToFile()

file_url.close()

###需要重新打开再读一下
file_url = open('url.txt','r')
file_lines = len(file_url.readlines())
print "there are %d url in %s" %(file_lines,file_url)
file_url.close()

c++  写的读 url.xml,放到map里面,对map<string , int>的value进行排序,得到前100个,运行一下也就55s,还是很快的,url长度进行了限制小于256个字符:

#pragma once
/*
//计算代码段运行时间的类
//
*/
#include <iostream>

#ifndef ComputeTime_h
#define ComputeTime_h

//单位毫秒

class   ComputeTime
{
private:
	int Initialized;
	__int64 Frequency;
	__int64 BeginTime;  

public:  

	bool Avaliable();
	double End();
	bool Begin();
	ComputeTime();
	virtual   ~ComputeTime();    

};  

#endif
#include "stdafx.h"
#include "ComputeTime.h"
#include <iostream>
#include <Windows.h>

ComputeTime::ComputeTime()
{
	Initialized=QueryPerformanceFrequency((LARGE_INTEGER   *)&Frequency);
}  

 ComputeTime::~ComputeTime()
{  

}  

 bool   ComputeTime::Begin()
{
	if(!Initialized)
		return 0;

	 return   QueryPerformanceCounter((LARGE_INTEGER   *)&BeginTime);
 }

 double   ComputeTime::End()
{
	 if(!Initialized)
		return 0;

	 __int64   endtime;  

	 QueryPerformanceCounter((LARGE_INTEGER   *)&endtime);  

	 __int64   elapsed = endtime-BeginTime;  

	 return   ((double)elapsed/(double)Frequency)*1000.0;  //单位毫秒
 }  

 bool   ComputeTime::Avaliable()
{
	 return Initialized;
}   

// sortUrl.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
//#include <utility>
#include <vector>
#include <map>
#include <fstream>
#include <iostream>
#include <string>
#include <algorithm>
#include "ComputeTime.h"

using namespace std;

map<string,int> urlfrequency;

typedef pair<string, int> PAIR;

struct CmpByValue
{
	bool operator()(const PAIR& lhs, const PAIR& rhs)
	{
		return lhs.second > rhs.second;
	}
};

void find_largeTH(map<string,int> urlfrequency)
{
	//把map中元素转存到vector中 ,按照value排序
	vector<PAIR> url_quency_vec(urlfrequency.begin(), urlfrequency.end());
	sort(url_quency_vec.begin(), url_quency_vec.end(), CmpByValue());
	//url_quency_vec.size()
	for (int i = 0; i != 100; ++i)
	{
		cout<<url_quency_vec[i].first<<endl;
		cout<<url_quency_vec[i].second<<endl;
	}
}

//urlheap的建立过程,URL插入时候存在的
void insertUrl(string url)
{
	pair<map<string ,int>::iterator, bool> Insert_Pair;
	Insert_Pair = urlfrequency.insert(map<string, int>::value_type(url,1));

	if (Insert_Pair.second == false)
	{
		(Insert_Pair.first->second++);
	}

}

int _tmain(int argc, _TCHAR* argv[])
{
	fstream URLfile;
	char buffer[1024];
	URLfile.open("url.txt",ios::in|ios::out|ios::binary);

	if (! URLfile.is_open())
	{ cout << "Error opening file"; exit (1); }
	else
	{
	cout<<"open file success!"<<endl;
	}

	ComputeTime cp;
	cp.Begin();
	int i = 0;
	 while (!URLfile.eof())
	{
	URLfile.getline (buffer,1024);
	//cout << buffer << endl;
	string temp(buffer);
	//cout<<i++<<endl;
	insertUrl(temp);
	}  

	find_largeTH(urlfrequency);

	cout<<"running time: "<<cp.End()<<"ms"<<endl;

	getchar();
	//system("pause");
	return 0;
}

实验结果:



版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 13:43:07

100万个URL如何找到出现频率最高的前100个?的相关文章

草根站长如何挣到人生第一个100万

导读:财神的文章总有种醍醐灌顶的感觉,读完本文能在思维上和视野上有所拓展,但我知道文章标题党了,本文你并不能赚到人生的100万,但本文也许会改变你的建站思路. 每 个做网络的人其实都有过想暴富的心态,包括我自己当时想做网络就是因为受到朋友和网上一些大神们的影响.看到别人几千几百万的赚真的是太吸引了.说实话, 大部分人都是因为这样的心态开始做网络的.当然也有一些是因为兴趣爱好,或者想搞点兼职帮补开支的.但是基本90%的站长都做过创富梦. 特 别是我们看多了马云, 史玉柱,李彦宏,马化腾等他们被吹嘘

汇编语言-判断素数:找出前100以内的素数

1. 题目:找出前100以内素数. 2. 要求:将前100以内素数找出并显示值,要求每行显示5个素数. 先列出求100以内素数的C++代码 然后根据C++代码写汇编代码,相对来说比较容易. 1 //The program is to find the primes from 1 to 100 with C++ 2 //By Karllen 3 //time: 05/19/2014 4 5 #include <iostream> 6 int main(void) 7 { 8 9 int numb

我们用4行代码节省了100万 记录与阿里云PCDN相遇全过程

我们公司主要做视频在线点播,还有少量视频下载.比较关心网络加速,首先就是价格,其次是首播时间.流畅率这几个核心性能指标.目前使用阿里云PCDN也有几个月了,整体结果是超预期.值得安利的.写这篇文章,希望能通过选型对比.接入过程.效果实现几个方面的真实感受,给还在犹豫的同行们一些启发,希望文章内容对你们有所帮助. 废话少说,先直接说效果:每月的CDN费用比以前少了近50%,首播时间.流畅率略优于使用中的2家CDN.这个结果真是让人喜大普奔,原以为PCDN价格比CDN低这么多,性能会不好,没想到这货

Java 最常用类(前100名)来自一万个开源项目

大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库,也有第三方库.每个类在同一个项目中只计数一次,下面的列表中显示前 100 名的类. 以下列表中按使用最多的类进行排序,第三个数值表示 10000 个项目里使用到该类的项目数,而完整的列表请看 here. java.util.ArrayList(6958) java.io.IOException(6866) java.util.

如何打造100万客户数据库之诱饵设计

客户数据库可以经由多种方式显露进去,可以是QQ群,可所以至日列表,可所以微博粉丝,可以是QQ好友......等,只需是客户能够有用的收到你的促销音讯的具有内容均可以称为一个客户数据库. 我这样魔杖你,一个1万人的高风致客户数据库,护民图库一年产100万利害常轻松的!许多朋侪可能感觉不堪设想,确实只有你明白数据库营销,这个数据是很方针的,为甚么呢? 所谓高品质的客户数据库便是对你的产品笼统办事非常有兴味的一群人,比如说肥胖人群,他们对减肥的西部曲直刺猬常暴烈的,尽管,你想从他们一总体兴许几个人饭粒

QQ营销经典案例,给家具业务员的一堂课 (三个月实现月销1万到100万的蜕变)

价值8000元的给家具业务员的一堂课 (三个月实现月销1万到100万的蜕变) 大家好!先给大家分享个我身边的故事.我有个朋友,姓刘,我称他老刘,据说以前从事过很多行业的销售,单我知道的他做过:节能灯销售.太阳能热水器销售,卫浴销售,至于他还有没有做其它行业的销售我就不知道了,我经常给他开玩笑,老刘360行都快做一遍了吧. 作为一个销售员,为什么如此频繁换行业呢!我给他的分析是这样的, 1:是做不出成绩,没成绩肯定挣不到钱.结果不是被领导辞掉,就是自己不好意思再做了. 2:做事情没有恒心,听风就是

短视频创业,如何在技术上节省100万启动资金?

从2016年开始,都说短视频创业最好的时代来临了,一大批短视频创业公司在北上广遍地开花.如果你是一名创业者,正想瞄准短视频创业风口大干一番:抑或是一名企业管理者,想通过短视频来丰富.拓展你的业务,你都应该了解短视频开发的那些事儿. 1.自研 or  采用第三方服务 如果完全从0开始研发短视频app,需要考虑以下方面: 自研之投入成本: |招聘成本 招聘人均成本≈招聘人员时间成本+相关渠道费用+面试官时间成本+机会成本 招聘人员时间成本:相关人员在搜寻此岗位候选人的时间,包括搜寻简历.铺设渠道,跟

100万个数中找出最大的前K个数

拿到这个题目我想到了很多方法,但是在我想到的方法中,要把在100万个数中找到前k个数,都不适用.最后通过我的不断研究,我想到了我认为最简单的方法,就是利用堆来做这道题目. 下面我分析一下我用堆排序的思路: 1.我先建一个大小为k的堆. 2.把100万中前k个数放到这个堆中. 3.把这个堆调成小堆. 4.把100万个从k到100万之间的数字拿出来和堆的根结点作比较. 5.如果根结点小于这之间的某一个数,就把这个数拿给根结点,然后继续调成小堆.否则继续找 6.直到找完这100万个数,堆中放的就是最大

运用简单的bloomfilter算法生成100万个不重复的随机数

本文中只是简单的体会bloomFilter算法的基本原理,设计实现一个生成100万个不重复的随机数. 选择3个分布均匀质数,在这里面质数的选择还是挺有讲究的,要注意不能太小,必须能够满足bloomfilter空间,不然整个空间都是1了还没有找到100万个不重复的随机数.不多说,上代码. #include<stdio.h> #include<stdlib.h> #include<time.h> #include<cstdbool> #define MAXNUM