[算法學習]大數據量算法題

參考:http://blog.csdn.net/v_july_v/article/details/6712171

1.騰訊面試題:給40億個不重複的unsigned int的整數,沒排過序的,然後再給一個數,如何快速判斷這個數是否在那40億個數當中?

思想:用數組來存這40億個數,而且只能用bit來表示。why?40億約等於4G,就算你用一個字節來,也需要4GB,32位的機子爆掉了。如果用bit來存,意思一個字節就能表示8個數,這個樣子只需要512M內存。這個屬於接受範圍。如果有內存要求,則可以分塊。

如何用bit位表示某個數?下面以1爲例。

  • 1/8=0,即存在數組的第0位。
  • 1%8=1,即存在數組第0位的char的第1位,將該位置爲1。
在舉個例子,12345。

  • 12345/8=1543,即數組的第1543位
  • 12345%8=1,即存在數組的第1543位的char的第1位,將該位置爲1。
我們以16進制來表示char中每一位單獨置爲1的情況,即0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01。

如何判斷將某一位置爲1?

以將a[0]的第二位置爲1爲例,用位或。a[0]=a[0] | 0x20;

判斷某一位是否置爲1?

判斷a[0]的第二位是否置爲1,用位與,a[0] &0x20.如果置爲1,返回非0,否則返回0.

#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
void setBit(char *arr,unsigned int num);
int isSet(char *arr,unsigned int num);
unsigned char tag[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
int main()
{
	char * arr=new char[5242880];//512M
	memset(arr,0,5242880);
	unsigned int num;
	fstream in("1.txt",ios::in);
	while(in>>num)
	{
		setBit(arr,num);
	}
	in.close();
	cout<<"初始化完畢..."<<endl;
	cout<<"請輸入需要判斷的數:";
	while(cin>>num)
	{
		if(isSet(arr,num)!=0x00)
		{
			cout<<num<<"在數組中"<<endl;
		}else
			cout<<num<<"不在數組中"<<endl;
	}
	delete[] arr;
	return 0;
}
/*
*功能:將num對應位置爲1
*/
void setBit(char *arr,unsigned int num)
{
	int loc=num/8;
	int remainder=num%8;
	arr[loc]=arr[loc] | tag[remainder];
}
/*
*功能:判斷num對應位是否置爲1?
*/
int isSet(char *arr,unsigned int num)
{
	int loc=num/8;
	int remainder=num%8;
	return arr[loc] & tag[remainder];
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章