散列的使用

散列

散列簡單來說:給N個正整數和M個負整數,問這M個數中的每個數是否在N中出現過。

比如:N:{1,2,3,4},M{2,5,7},其中M的2在N中出現過
對這個問題最直觀的思路是:對M中每個欲查的值x,都在N中遍歷一次,時間復雜度為 O(NM),但當N和M的值很大時,顯然無法承受

所以,我們可以設定一個bool型數據 hashTable[100010],其中hashTable[x]== true 表示正整數x在N個正整數中出現過,而hashTable[x]= false表示正整數x在N個正整數中沒有出現過。這樣就可以在一開始讀入N個正整數時就進行預處理,即當讀入的數為x時,就令hashTable[x] = true (說明: hashTable 數組需要初始化為false,表示初始狀態下所有數都未出現過)。 于是,對M個欲查詢的數,就能直接通過hashTable數組判斷出每個數是否出現過。顯然這種做法的時間復雜度為O(N+M),代碼如下:

#include<cstdio>
const  int  maxn=1;            //見注1  //maxn的值可以取大于0的任意數
bool hashTable[maxn]={false};  //見注2
int main()
{int n,m,x;printf("輸入n m的值\n"); scanf("%d%d",&n,&m);      //輸入nm兩個數組各自的長度for(int i=0;i<n;i++){printf("輸入第一組參照的第%d個x的值\n",i+1); scanf("%d",&x);           //鍵盤輸入n的數據hashTable[x]=true; }for(int i=0;i<m;i++){   printf("輸入第二組的第%d個值\n",i+1); scanf("%d",&x);       //鍵盤輸入m的數據if(hashTable[x]==true)  //判斷數據相同{printf("yes\n");    //相同則返回yes,否則返回no}elseprintf("no\n");}
}

注1:/* const 允許指定一個語義約束,編譯器會強制實
施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,
就應該明確使用const,這樣可以獲得編譯器的幫助。 即const是使這個值固定不再改變*/

注2:bool類型 為邏輯型,它的值只有true(1)和false(0)兩種值。
空間換時間,定義一個bool型數組hashTable[100010],其中hashTable[x]==true表示正整數x在N個正整數中出現過。這樣就可以在一開始讀入N個正整數的時候就進行預處理。
同樣的,如果題目要求M個欲查詢的數中每個數在N個數中出現的次數,那么可以把nastTable數組替換為int型,然后在輸入N個數時進行預處理,即當輸入的數為x時,就令nhashTable[x]++,這樣就可以用O(N + M)的時間復雜度輸出每個欲查詢的數出現的次數。代碼如下:

#include<cstdio>
const  int  maxn=1;       /*  const 允許指定一個語義約束,編譯器會強制實
施這個約束,允許程序員告訴編譯器某值是保持不變的。如果在編程中確實有某個值保持不變,
就應該明確使用const,這樣可以獲得編譯器的幫助。*/
bool hashTable[maxn]={false};
int main()
{int n,m,x;printf("輸入n m的值\n"); scanf("%d%d",&n,&m);for(int i=0;i<n;i++){printf("輸入第一組參照的第%d個x的值\n",i+1); scanf("%d",&x);hashTable[x]=true; }for(int i=0;i<m;i++){   printf("輸入第二組的第%d個值\n",i+1); scanf("%d",&x);if(hashTable[x]==true){printf("yes\n");}elseprintf("no\n");}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532661.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532661.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532661.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于C++中的unordered_map和unordered_set不能直接以pair作為鍵名的問題

關于C中的unordered_map和unordered_set不能直接以pair作為鍵名的問題 在 C STL 中&#xff0c;不同于有序的 std::map 和 std::set 是基于紅黑樹實現的&#xff0c;std::unordered_map 和 std::unordered_set 是基于哈希實現的&#xff0c;在不要求容器內的鍵有序&#xff0c…

AI編譯器與傳統編譯器的聯系與區別

AI編譯器與傳統編譯器的區別與聯系 總結整理自知乎問題 針對神經網絡的編譯器和傳統編譯器的區別和聯系是什么&#xff1f;。 文中提到的答主的知乎主頁&#xff1a;金雪鋒、楊軍、藍色、SunnyCase、貝殼與知了、工藤福爾摩 筆者本人理解 為了不用直接手寫機器碼&#xff0…

python學習1:注釋\變量類型\轉換函數\轉義字符\運算符

python基礎學習 與大多數語言不同&#xff0c;python最具特色的就是使用縮進來表示代碼塊&#xff0c;不需要使用大括號 {} 。縮進的空格數是可變的&#xff0c;但是同一個代碼塊的語句必須包含相同的縮進空格數。 &#xff08;一個tab4個空格&#xff09; Python語言中常見的…

Python、C++ lambda 表達式

Python、C lambda 表達式 lambda函數簡介 匿名函數lambda&#xff1a;是指一類無需定義標識符&#xff08;函數名&#xff09;的函數或子程序。所謂匿名函數&#xff0c;通俗地說就是沒有名字的函數&#xff0c;lambda函數沒有名字&#xff0c;是一種簡單的、在同一行中定義函…

python 學習2 /輸入/ 輸出 /列表 /字典

python基礎學習第二天 輸入輸出 xinput("輸入內容") print(x)input輸出&#xff1a; eval :去掉字符串外圍的引號&#xff0c;按照python的語法執行內容 aeval(12) print(a)eval輸出樣式&#xff1a; 列表 建立&#xff0c;添加&#xff0c;插入&#xff0c;刪去…

Linux、Mac 命令行快捷鍵

Linux、Mac 命令行快捷鍵 Linux 命令行編輯快捷鍵&#xff0c;參考了好多個&#xff0c;應該算是比較全的了&#xff0c;Linux 和 Mac 的都有&#xff0c;筆者本人比較常用的也已經紅色標出來了&#xff0c;如有錯誤或遺漏&#xff0c;歡迎留言指出。 光標移動及編輯&#xff…

Python 命令行傳參

Python 命令行傳參 說到 python 命令行傳參&#xff0c;可能大部分人的第一反應就是用 argparse。的確&#xff0c;argparse 在我們需要指定多個預設的參數&#xff08;如深度學習中指定模型的超參數等&#xff09;時&#xff0c;是非常有用的。但是如果有時我們只需要一個參數…

快速排序 C++

快速排序 C 本文圖示借鑒自清華大學鄧俊輝老師數據結構課程。 快速排序的思想 快速排序是分治思想的典型應用。該排序算法可以原地實現&#xff0c;即空間復雜度為 O(1)O(1)O(1)&#xff0c;而時間復雜度為 O(nlogn)O(nlogn)O(nlogn) 。 算法將待排序的序列 SSS 分為兩個子…

Linux命令行下感嘆號的幾個用法

Linux命令行下 " ! " 的幾個用法 ! 在大多數編程語言中表示取反的意思&#xff0c;但是在命令行中&#xff0c;他還有一些其他的神奇用法。熟練掌握這些用法&#xff0c;可以大大提高我們日常命令行操作的效率。 1 執行歷史命令 !! ! 在命令行中可以用來執行歷史…

三地址碼簡介

三地址碼簡介 三地址碼&#xff08;Three Address Code&#xff09;是一種最常用的中間語言&#xff0c;編譯器可以通過它來改進代碼轉換效率。每個三地址碼指令&#xff0c;都可以被分解為一個四元組&#xff08;4-tuple&#xff09;的形式&#xff1a;&#xff08;運算符&am…

llvm與gcc

llvm與gcc llvm 是一個編譯器&#xff0c;也是一個編譯器架構&#xff0c;是一系列編譯工具&#xff0c;也是一個編譯器工具鏈&#xff0c;開源 C11 實現。 gcc 相對于 clang 的優勢&#xff1a; gcc 支持更過語言前端&#xff0c;如 Java, Ada, FORTRAN, Go等gcc 支持更多地 …

攻防世界web新手區解題 view_source / robots / backup

1**. view_source** 題目描述&#xff1a;X老師讓小寧同學查看一個網頁的源代碼&#xff0c;但小寧同學發現鼠標右鍵好像不管用了。 f12查看源碼即可發現flag 2. robots 題目描述&#xff1a;X老師上課講了Robots協議&#xff0c;小寧同學卻上課打了瞌睡&#xff0c;趕緊來教教…

python參數傳遞*args和**kwargs

python參數傳遞*args和**kwargs 和* 實際上真正的Python參數傳遞語法是 * 和 ** 。*args 和 **kwargs 只是一種約定俗成的編程實踐。我們也可以寫成 *vars 和 **kvars 。就如同其他常規變量的命名一樣&#xff0c; args 和 kwargs 只是一種習慣的名稱。 *args 和 **kwargs 一…

聽GPT 講Rust源代碼--src/tools(25)

File: rust/src/tools/clippy/clippy_lints/src/methods/suspicious_command_arg_space.rs 在Rust源代碼中&#xff0c;suspicious_command_arg_space.rs文件位于clippy_lints工具包的methods目錄下&#xff0c;用于實現Clippy lint SUSPICIOUS_COMMAND_ARG_SPACE。 Clippy是Ru…

Java一次編譯,到處運行是如何實現的

Java一次編譯&#xff0c;到處運行是如何實現的 轉自&#xff1a;https://cloud.tencent.com/developer/article/1415194 &#xff08;排版微調&#xff09; JAVA編譯運行總覽 Java是一種高級語言&#xff0c;要讓計算機執行你撰寫的Java程序&#xff0c;也得通過編譯程序的…

JIT(動態編譯)和AOT(靜態編譯)編譯技術比較

JIT&#xff08;動態編譯&#xff09;和AOT&#xff08;靜態編譯&#xff09;編譯技術比較 轉自&#xff1a;https://www.cnblogs.com/tinytiny/p/3200448.html Java 應用程序的性能經常成為開發社區中的討論熱點。因為該語言的設計初衷是使用解釋的方式支持應用程序的可移植…

python解釋器

python解釋器 計算機編程語言 本部分參考自&#xff1a;https://zhuanlan.zhihu.com/p/141212114 從計算機編程語言說起&#xff0c;它主要分為三類&#xff1a;機器語言、匯編語言、高級語言。 機器語言是一種計算機可以直接識別并執行的二進制指令集。由于其可以直接交給…

編譯型語言與解釋型語言

編譯型語言與解釋型語言 首先要說明&#xff0c;編譯型語言與解釋型語言這種分類方法是不科學的&#xff0c;或者說已經過時了&#xff0c;但是這種稱呼大抵還是能夠讓人明白我們將要討論的是什么東西。 文中所列參考是筆者認為比較有幫助的一些擴展閱讀內容。 首先貼一個很形…

常見的各種shell及其區別

常見的各種shell及其區別 引子 for((i1;i<10;i)); do echo $(expr $i \* 3 1); done 網上搜到的 shell for循環腳本&#xff0c;別人都能正常運行&#xff0c;我卻報錯&#xff1a; Syntax error: Bad for loop variable究竟是怎么回事呢&#xff1f; shell簡介…

shell腳本 變量

shell腳本 變量類型 什么是Shell變量 用一個固定的字符串去表示不固定的內容。 Shell變量的類型 shell腳本中自定義變量的類型&#xff0c;我們這里分為&#xff1a; 自定義變量環境變量位置變量與定義變量 這四類&#xff0c;它們有一些相同點&#xff0c;但又有些不同點…