雜湊表之簡易數學原理和簡易實現(史上最簡單易懂的雜湊表介紹)
什麼是雜湊表呢? 我先不說, 但其思想確實厲害。 下面, 我以最簡單易懂的方式來介紹雜湊表。
你要是去看教科書啊, 還沒有理解雜湊表的原理, 他就給你介紹近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搭載A9x和A9處理器 成史上最便宜蘋果手機
錯過了凌晨的蘋果春季釋出會? 應該說你是幸運的,因為蘋果真的像之前洩露的一樣「按部就班」釋出了 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