多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > 數(shù)據(jù)結(jié)構(gòu):散列1(分離鏈接法)

數(shù)據(jù)結(jié)構(gòu):散列1(分離鏈接法)

來源:程序員人生   發(fā)布時(shí)間:2017-03-20 09:39:27 閱讀次數(shù):4112次

散列:

將每一個(gè)鍵映照到從0到TableSize⑴這個(gè)范圍的某個(gè)數(shù),并將其放到適當(dāng)?shù)膯卧小_@個(gè)映照成為散列函數(shù)

理想情況下,不同的鍵映照到不同的單元,但是現(xiàn)實(shí)中是不可能的,所以好的散列函數(shù),應(yīng)當(dāng)盡可能均勻地分配鍵。

列表的大小最好是素?cái)?shù),這個(gè)非常非常重要。


解決沖突:

沖突:如果1個(gè)元素插入時(shí)與1個(gè)已插入的元素散列到相同的值,那末就產(chǎn)生了1個(gè)沖突。

解決沖突的方法:分離鏈接法和探測(cè)法

分離鏈接法:將散列到的同1個(gè)值的所有元素保存到1個(gè)鏈表中。肯定是要分配內(nèi)存。

對(duì)List和Vector,都是使用自己實(shí)現(xiàn)的簡單模板。Vector模板的實(shí)現(xiàn) List模板的實(shí)現(xiàn)

探測(cè)法在下1章:數(shù)據(jù)結(jié)構(gòu):散列2(探測(cè)法)

先看看1些公用的函數(shù):

//通過迭代器查找相同的對(duì)象
	template<class InputIterator, class T>
	InputIterator find(InputIterator first, InputIterator last, const T& val)
	{
		while (first != last)
		{
			if (*first == val) return first;
			++first;
		}
		return last;
	}
	//是不是1個(gè)素?cái)?shù)
	bool isPrime(int num)
	{
		if (num == 2 || num == 3)
		{
			return true;
		}
		if (num % 6 != 1 && num % 6 != 5)
		{
			return false;
		}
		for (int i = 5; i*i <= num; i += 6)
		{
			if (num % i == 0 || num % (i + 2) == 0)
			{
				return false;
			}
		}
		return true;
	}
	//查找比x大的第1個(gè)素?cái)?shù)
	int nextPrime(int n)
	{
		bool state = isPrime(n);
		while (!state)
		{
			state = isPrime(++n);

		}
		return n;
	}
	//string的散列函數(shù)	
	int hash(const std::string& key)
	{
		int hashVal = 0;
		for (size_t i = 0; i < key.length(); i++)
		{
			hashVal = 37 * hashVal + key[i];
		}
		return hashVal;
	}
	//int的散列函數(shù)
	int hash(int key)
	{
		return key;
	}
使用分離鏈接法的代碼:

	//分離鏈接法
	template <typename HashedObj>
	class HashTable
	{
	public:
		//構(gòu)造函數(shù)
		explicit HashTable(int size = 101) :theList(size){}
		//包括某個(gè)對(duì)象
		bool contains(const HashedObj& x)const
		{
			const List<HashedObj>& whichList = theList[myhash(x)];
			return find(whichList.begin(), whichList.end(), x) != whichList.end();
		}
		//清空散列表
		void makeEmpty()
		{
			for (int i = 0; i < theList.size(); i++)
			{
				theList[i].clear();//對(duì)每一個(gè)散列表清空
			}
		}
		//插入數(shù)據(jù)
		bool insert(const HashedObj& x)
		{
			//找到散列表中對(duì)應(yīng)位置的鏈表
 			List<HashedObj>& whichList = theList[myhash(x)];
			//在鏈表中找到x
 			List<HashedObj>::iterator iter = find(whichList.begin(), whichList.end(), x);
			if (iter != whichList.end())
			{
				return false;
			}
 			whichList.push_back(x);
			++currentSize;
			//數(shù)據(jù)的大小超過了散列表的大小,因而可知,理想情況下,散列表下的鏈表應(yīng)當(dāng)是只放1個(gè)數(shù)據(jù)是最好的
			if (currentSize > theList.size())
			{
				rehash();//重構(gòu)1個(gè)更加大的散列表
			}
			return true;
		}
		//刪除數(shù)據(jù)
		void remove(const HashedObj& x)
		{
			//找到鏈表
			List<HashedObj>& whichList = theList[myhash(x)];
			List<HashedObj>::iterator iter = find(whichList.begin(), whichList.end(), x);
			if (iter == whichList.end())
			{
				return false;
			}
			//刪除
			whichList.erase(iter);
			--currentSize;
			return true;
		}
	private:
		Vector<List<HashedObj>> theList;//散列表
		int currentSize;//當(dāng)前數(shù)據(jù)量
		//重新構(gòu)造1個(gè)散列表
		void rehash()
		{
			//原來的散列表
 			Vector<List<HashedObj>> oldList = theList;
			//散列表的大小擴(kuò)大兩倍,然后再找接下來的第1個(gè)素?cái)?shù)
			theList.resize(nextPrime(2 * theList.size()));
			//清空散列表
			for (int i = 0; i < theList.size(); i++)
			{
				theList[i].clear();
			}
			//插入舊的數(shù)據(jù)
			currentSize = 0;
			for (int i = 0; i < oldList.size(); i++)
			{
				List<HashedObj>::iterator iter = oldList[i].begin();
				while (iter != oldList[i].end())
				{
					insert(*iter);
					iter++;
				}
			}
		}
		//計(jì)算散列數(shù)
		int myhash(const HashedObj& x)const
		{
			int hashVal = hash(x);
			hashVal %= theList.size();
			if (hashVal < 0)
			{
				hashVal += theList.size();
			}
			return hashVal;
		}
	};



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 成片免费观看视频在线网 | 久久久高清日本道免费观看 | 天堂亚洲欧美日韩一区二区 | www.操操| 国产精品一国产精品免费 | 久久男人精品 | 久久欧美精品欧美九久欧美 | 宇都宫紫苑99av | 亚洲综合小说久久另类区 | 日本一级黄色毛片 | 岛国精品成人 | 亚洲黄色在线视频 | 伊人丁香婷婷综合一区二区 | 国产精品亚洲片在线观看麻豆 | 精品久久久久久久一区二区伦理 | 女人毛片a毛片久久人人 | 成人影院vs一区二区 | 亚洲影院手机版777点击进入影院 | 亚州1区2区3区4区产品乱码2021 | 久久国产成人精品国产成人亚洲 | 亚洲成人av | 久久亚洲国产视频 | 请看一下欧美一级毛片 | 天堂在线视频观看 | 久久www免费人成看国产片 | 欧美成人免费观看国产 | 日本不卡在线视频 | jizzjlzz大学生| 亚洲免费网站在线观看 | 免费观看www视频 | 国产亚洲精品精品国产亚洲综合 | 亚洲精品图片 | 夜夜躁日日躁狠狠 | 性爱视频在线播放 | 精品国产v无码大片在线观看 | 日本免费性 | 校园春色国产精品 | 久久久青草青青国产亚洲免观 | 日韩久久久精品中文字幕 | 亚洲一区二区三区精品视频 | 欧美一区二区精品 |