1. 程式人生 > >雜湊表之簡易數學原理和簡易實現(史上最簡單易懂的雜湊表介紹)

雜湊表之簡易數學原理和簡易實現(史上最簡單易懂的雜湊表介紹)

       什麼是雜湊表呢? 我先不說, 但其思想確實厲害。 下面, 我以最簡單易懂的方式來介紹雜湊表。

       你要是去看教科書啊, 還沒有理解雜湊表的原理, 他就給你介紹近10種防衝突的方法, 這就是中國的教育。 你要是去網上搜點資料問為什麼雜湊表查詢的時間複雜度為O(1), 他說因為雜湊表只需要比較一次即可。 最後你滿意而來,掃興而歸。

        我呢? 喜歡把複雜的東西搞簡單, 下面我來介紹一下雜湊表.

        為了簡便起見,假設有一個數組An = {81, 62, 55, 43, 97, 76, 49, 98, 64};  這大概就是你在高一上學期數學學習的內容吧。下面, 任何給定一個數x, 如果判斷x是否在該給定的數列An中呢? 作為一個正常的人, 我們自然會想, 把x先和81, 62, ...,  進行比較唄, 對了, 你這麼想就對了, 這標誌著你完全沒有入門雜湊表。

        從這個角度來講, 提出雜湊表的人, 確實很了不起, 因為他沒有采用正常人的思路。我們來看看雜湊表人的思路:


        現在, 我們來看看程式:

#include <iostream>
using namespace std;

int hash(int key, int n)
{
	return key % n;
}

int main()
{
	int a[9] = {81, 62, 55, 43, 97, 76, 49, 98, 64};
	int b[9] = {-1, -1, -1, -1, -1, -1, -1, -1, -1};
	int i = 0;
	for(i = 0; i < 9; i++)
	{
		b[hash(a[i], 10)] = a[i];
	}
	
	int x = 0;
	for(x = 0; x < 1000000; x++)
	{
		if(b[hash(x, 10)] == x) //對於每一個x, 只需要比較一次哈
		{
			cout << x << " is in a[...]" << endl;
		}
	}

	return 0;
}
      上述程式的結果為:

43 is in a[...]
49 is in a[...]
55 is in a[...]
62 is in a[...]
64 is in a[...]
76 is in a[...]
81 is in a[...]
97 is in a[...]
98 is in a[...]

       好了, 你還有疑問,我為什麼要選擇那麼特殊的陣列An呢? 因為經歷h(z) = z %10的雜湊變化後, 不會衝突。 什麼是衝突? 好了, 是該學習衝突和衝突的解決的時候了, 但這不是本文要討論的問題, 請參考教材。

       很多時候, 軟體開發中, 高深的演算法可以沒有, 但雜湊表卻無處不在。 恭喜你, 也恭喜我, 又前進了一小步。

相關推薦

簡易數學原理簡易實現簡單易懂介紹

       什麼是雜湊表呢? 我先不說, 但其思想確實厲害。 下面, 我以最簡單易懂的方式來介紹雜湊表。        你要是去看教科書啊, 還沒有理解雜湊表的原理, 他就給你介紹近10種防衝突的方法, 這就是中國的教育。 你要是去網上搜點資料問為什麼雜湊表查詢的時間複雜

Android原生第一課-瞭解目錄結構其用處詳細

學的東西,很久沒用就會忘記,所以寫個東西記錄一下。 這是我之前用Android Studio 建的專案。 目錄檔案 作用 .gradle gradle專案產生資料夾(自動編譯工具產生的檔案) .idea IDEA專案資料夾(開發工具產生的檔案) app

【Oracle 叢集】ORACLE DATABASE 11G RAC 知識圖文詳細教程RAC 工作原理相關元件

概述:寫下本文件的初衷和動力,來源於上篇的《oracle基本操作手冊》。oracle基本操作手冊是作者研一假期對oracle基礎知識學習的彙總。然後形成體系的總結,一則進行回顧複習,另則便於查詢使用。本圖文文件亦源於此。閱讀Oracle RAC安裝與使用教程前,筆者先對這篇文章整體構思和形成進行梳理。

PCA演算法的數學原理C++語言Eigen庫實現

PCA演算法的數學原理最近在學習影象處理相關方面的知識,在影象壓縮時用到主成分分析演算法(Principal Component Analysis PCA)。數學理論主要參考了這篇部落格點選開啟連結,博主寫的非常好,通俗易懂。這裡總結了一下PCA演算法的實現步驟如下:設有m條

簡單MySQL教程詳解基礎篇聯合查詢

常用術語 內連線 外連線 左外連線 右外連線 注意事項: 自連線 子查詢 在上篇文章史上最簡單MySQL教程詳解(基礎篇)之資料庫設計正規化及應用舉例我們介紹過,在關係型資料庫中,我們通常為了減少資料的冗餘量將對資料表進行規範,將

爬蟲基本原理介紹初步實現以抓取噹噹網圖書資訊為例

本文程式碼等僅作學習記錄使用 一、爬蟲原理 網路爬蟲指按照一定的規則(模擬人工登入網頁的方式),自動抓取網路上的程式。簡單的說,就是講你上網所看到頁面上的內容獲取下來,並進行儲存。網路爬蟲的爬行策略分為深度優先和廣度優先。 (1)、深度優先 深度

1、鏈增、刪、查實現C語言

pan 沒有 null [] src ase 找到 調用 strlen 一、功能描述: 可以創建節點並添加到鏈表中、查看鏈表中的所有節點、並可以刪除特定的節點 二、代碼實現 1、主函數main主要實現的是從後臺鍵入不同的字符,執行對應的函數來實現特定的操作代碼如下:

Intellij idea簡單的教程Linux下安裝與破解Intellij idea2017

成功 zxvf java 新建 pre form 旗艦版 lan intel 一、前言 這一節我們介紹在Linux下如何安裝與破解Intellij idea2017。現在有很多公司開發環境都是Linux,所以掌握在Linux環境下使用Idea辦公也是咱們必須得掌握的技能。

[轉] webpack前端效能優化全,不斷更新中。。。

最近在用webpack優化首屏載入效能,通過幾種外掛之後我們上線前後的速度快了一倍,在此就簡單的分享下吧,先上個優化前後首屏渲染的對比圖。 可以看到總下載時間從3800ms縮短到1600ms。 我們在用webpack時一般都會選擇多入口檔案吧,為的就是將自己的原始碼跟第三方庫程式碼分離。這是之前的程式

Java 粘包/半包 原理與拆包實戰

瘋狂創客圈 Java 聊天程式【 億級流量】實戰系列之13 【部落格園 總入口 】 本文的原始碼工程:Netty 粘包/半包原理與拆包實戰 原始碼 本例項是《Netty 粘包/半包原理與拆包實戰》 一文的原始碼工程。 寫在前面 大家好,我是作者尼恩。 為了完成了一個高效能的 Java 聊天程式,

redis的安裝命令的使用(全命令集合)

                                     redis的安裝和使用 

AS打jar包,打aar包簡單打法--無需輸入程式碼操作gradle終端

寫安卓專案時候偶爾需要將專案工程打包出來供別人用,有時候打出jar包也會叫sdk,看網上教程出現打包不成功,或者連資原始檔,本身有的依賴都一起打進去了,所以摸索出了一種只打出jar包,裡面只包含java程式碼,不包含lib裡面的jar包,這種純粹的jar包。如果需要一起使用可

iPhone SE搭載A9xA9處理器 成便宜蘋果手機

錯過了凌晨的蘋果春季釋出會? 應該說你是幸運的,因為蘋果真的像之前洩露的一樣「按部就班」釋出了 4 英寸的 iPhone SE、9.7 英寸的 iPad Pro 和一款 Apple Watch 的尼龍錶帶……下面讓小碼哥帶你60秒看懂蘋果釋出會: 別管創新不創新,蘋果還是有良心的:人家iPhone

Android Binder機制原理強理解,沒有之一

Binder是Android系統程序間通訊(IPC)方式之一。Linux已經擁有的程序間通訊IPC手段包括(Internet Process Connection): 管道(Pipe)、訊號(Signal)和跟蹤(Trace)、插口(Socket)、報文佇列(Messag

卡特蘭數簡單分析原理 為什麼可以求解出棧情況數 簡單

首先簡單看一下公式 公式就是若要求一個數,就把之前求出來的數,第一個乘以最後一個。 為什麼可以這樣就可以求出出棧情況數呢? 我們用遞迴的思想來看待。 這裡我們作一個假設。我們會把n個數分成兩部分來處理。就是必須等第一部分處理(棧內全部排空)完後,第二部分的數才能入棧,才

Android——簡單自定義開關按鈕的實現

很多時候,我們在很多無論是Android還是IOS的APP中都會遇到這樣的一種效果,有一個按鈕,我們點選一下,便會滑動一下,一會顯示“開”,一會顯示“關”,這便是開關按鈕了,比如:很多Android手機的設定功能裡,就有很多功能是用開關按鈕實現的,那麼這些開關按鈕時如何實

Android SeekBar 禁止拖動點選的實現可能是簡單完美的實現

在播放線上音訊時,需求是不能拖動進度條,讓音訊自然播放。 實現就很簡單了,不要和網上的那樣重寫onTouchEvent,沒有必要的,所以一定要了解Android的觸控機制。 直接監聽SeekBar

簡單MySQL教程詳解進階篇儲存引擎介紹及預設引擎設定

什麼是儲存引擎? 與其他資料庫例如Oracle 和SQL Server等資料庫中只有一種儲存引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換儲存引擎架構)的特性,也就意味著My

kD-tree 的C語言實現 帶有全的註釋解釋

kdtree的原理就是基於二叉樹的形式,將高維空間用超矩形進行劃分.其主要用途是用來求解高維空間中最近鄰的值. 下面是kdtree.h檔案,是kdtree資料結構的標頭檔案 #ifndef _KDTREE_H_ #define _KDTREE_H_ #ifdef

簡單的SpringBoot教程如何列印HelloWorld

一、前言Spring boot是由Pivotal團隊提供的全新框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。Spring boot包含的特性:建立獨立的Spring應用程式嵌入To