Java プログラミング スキル - データ構造とアルゴリズム「ハッシュ テーブル」

Java プログラミング スキル - データ構造とアルゴリズム「ハッシュ テーブル」

[[388064]]

基本的な紹介

ハッシュ テーブル (ハッシュ テーブルとも呼ばれます) は、キー値に基づいて直接アクセスされるデータ構造です。つまり、キーコード値をテーブル内の場所にマッピングしてレコードにアクセスし、検索を高速化します。このマッピング関数はハッシュ関数と呼ばれ、レコードを格納する配列はハッシュテーブルと呼ばれます。


Google コンピュータに関する質問

ある会社では、新入社員が仕事に報告するときに、新入社員の情報(ID、性別、年齢、住所など)を追加することを求めています。社員のIDを入力すると、その社員のすべての情報が検索される必要があります。

要件: データベースを使用せず、メモリを可能な限り節約し、高速であるほど良いです。

  1. パッケージ com.xie.hashtable;
  2.  
  3. java.util.Scanner をインポートします。
  4.  
  5. パブリッククラスHashTableDemo {
  6. 公共 静的void main(String[] args) {
  7. //ハッシュタブを作成する
  8. ハッシュタブ hashTab = new HashTab(7);
  9.  
  10. 文字列キー= "" ;
  11. スキャナー scanner = new Scanner( System.in );
  12. )の間{
  13. System.out.println ( "add: 従業員を追加" );
  14. System.out.println ( "list:従業員を表示" ) ;
  15. System.out.println ( "find: 従業員を検索" );
  16. System.out.println ( "delete: 従業員を削除します" );
  17. System.out.println ( "exit: プログラムを終了" );
  18. キー= スキャナ.next ( );
  19. スイッチ(キー){
  20. 場合  "追加"
  21. System.out.println ( "入力ID" ) ;
  22. int id = スキャナー.nextInt();
  23. System.out.println ( "入力名" ) ;
  24. 文字列= scanner.next ( );
  25. Emp emp = 新しい Emp(id、名前);
  26. hashTab.add (emp);
  27. 壊す;
  28. 場合  「リスト」 :
  29. ハッシュタブのリスト();
  30. 壊す;
  31. 場合  "探す"
  32. System.out.println ( "番号を入力してください" );
  33. 整数 いいえ= scanner.nextInt();
  34. hashTab.findEmpById(なし);
  35. 壊す;
  36. 場合  "消去"
  37. System.out.println ( "番号を入力してください" );
  38. int deleteNo = スキャナ.nextInt();
  39. hashTab.deleteEmpById(deleteNo);
  40. 壊す;
  41. 場合  "出口"
  42. スキャナーを閉じます() ;
  43. システム終了(0);
  44. 壊す;
  45. デフォルト
  46. 壊す;
  47. }
  48. }
  49. }
  50. }
  51.  
  52. // 複数のリンクリストを管理するためのハッシュテーブルを作成する
  53. クラスHashTab{
  54. プライベートint  サイズ;
  55. プライベートEmpLinkedList[] empLinkedListArray;
  56.  
  57. パブリックハッシュタブ( int  サイズ) {
  58. this.size =サイズ;
  59. empLinkedListArray = 新しいEmpLinkedList[サイズ];
  60. ( int i = 0; i <サイズ; i++) {
  61. empLinkedListArray[i] = 新しいEmpLinkedList();
  62. }
  63.  
  64. }
  65.  
  66. //従業員を追加
  67. パブリックvoidを追加します(Emp emp) {
  68. //従業員のIDに応じて、従業員を追加するリンクリストを取得します
  69. int empLinkedListNo = hashFun(emp.id);
  70. // empを対応するリンクリストに追加します
  71. empLinkedListArray[empLinkedListNo] .add (emp);
  72. }
  73.  
  74. //従業員を探す
  75. パブリックEmp findEmpById( int id) {
  76. 整数 いいえ= hashFun(id);
  77. Emp empById = empLinkedListArray[ no ].findEmpById(id);
  78. empByIdがnull場合
  79. System.out.println ( "id=" + id + "要素"は存在しません" );
  80. 戻る ヌル;
  81. }それ以外{
  82. System.out.println ( " existsid =" + id + ",name=" + empById.name );
  83. empByIdを返します
  84. }
  85. }
  86.  
  87. //従業員を削除
  88. パブリックvoid deleteEmpById( int id) {
  89. 整数 いいえ= hashFun(id);
  90. empLinkedListArray[ no ].deleteEmp(id);
  91. }
  92.  
  93. //ハッシュテーブルを走査する
  94. パブリックボイドリスト(){
  95. ( int i = 0; i <サイズ; i++) {
  96. empLinkedListArray[i].list(i);
  97. }
  98. }
  99.  
  100. //単純な係数法を使用してハッシュ関数を記述します
  101. プライベートint hashFun( int id) {
  102. id % sizeを返します
  103. }
  104.  
  105. }
  106.  
  107. // 従業員を表す
  108. クラス Emp {
  109. 公共 整数ID;
  110. パブリック文字列;
  111. パブリックEmp;
  112.  
  113. パブリックEmp( int id, String name ) {
  114. id は、
  115. this.name =名前;
  116. }
  117.  
  118. @オーバーライド
  119. パブリック文字列toString() {
  120. 戻る  「エンプ{」 +
  121. "id=" + id +
  122. ", 名前='" +名前+ '\ '' +
  123. '}' ;
  124. }
  125. }
  126.  
  127. //リンクリストを表す
  128. クラス EmpLinkedList {
  129. //ヘッドポインタ
  130. プライベートエンプヘッド;
  131.  
  132. //リンクリストに従業員を追加する
  133. //説明:
  134. //1. 従業員を追加すると、IDは自動的に増加します。つまり、IDの割り当ては常に小さいものから大きいものへと進むため、従業員をこのリンクリストの末尾に直接追加するだけです。
  135. パブリックvoidを追加します(Emp emp) {
  136. //最初の従業員を追加する場合
  137. ヘッドがnull場合
  138. ヘッド = emp;
  139. }それ以外{
  140. Emp curr = ヘッド;
  141. )の間{
  142. curr.next == nullの場合){
  143. 壊す;
  144. }
  145. curr = curr.next ;
  146. }
  147. emp の次の行にポインターを置きます
  148. }
  149. }
  150.  
  151. //トラバース
  152. パブリックvoid リスト( int  いいえ) {
  153. ヘッドがnull場合
  154. System.out.println ( "No." +( no +1)+ "リンクリストは空です" ) ;
  155. 戻る;
  156. }
  157. System.out.print ( "No." +( no +1)+ "リンクリストの情報は次のとおりです:" );
  158. Emp curr = ヘッド;
  159. )の間{
  160. (カレントがnullではない場合
  161. システム.out.printf ( "=>id=%d,name=%s\t" 、curr.id、curr.name ) ;
  162. curr = curr.next ;
  163. }それ以外{
  164. 壊す;
  165. }
  166. }
  167. System.out.println( ) ;
  168. }
  169.  
  170. //IDで従業員を検索
  171. パブリックEmp findEmpById( int id) {
  172. ヘッドがnull場合
  173. System.out.println ( "リンクリストは空です" ) ;
  174. 戻る ヌル;
  175. }
  176. Emp temp = ヘッド;
  177. while ( temp != null ) {
  178. if ( temp .id == id) {
  179. 戻る 温度;
  180. }
  181. temp = temp . next ;
  182. }
  183. 戻る ヌル;
  184. }
  185.  
  186. //IDで従業員を削除
  187. パブリックvoid deleteEmp( int id) {
  188. ヘッドがnull場合
  189. System.out.println ( "id=" +id+ "の従業員は存在しません" );
  190. 戻る;
  191. }
  192. Emp curr = ヘッド;
  193. ブールフラグ = false ;
  194. )の間{
  195. (カレントがnullの場合
  196. 壊す;
  197. }
  198. curr.next.id == id)の場合{
  199. フラグ = true ;
  200. 壊す;
  201. }
  202. curr = curr.next ;
  203. }
  204. if (フラグ) {
  205. curr.next = curr.next . next ;
  206. }それ以外{
  207. System.out.println ( "id=" +id+ "の従業員は存在しません" );
  208. }
  209. }
  210.  
  211. }

【編集者のおすすめ】

  1. K8S の基本的なアーキテクチャ概念とネットワーク モデルを理解するのに役立つ 5 分
  2. 1992 年に Baidu のプログラマーが逮捕されたことは、私たちにどのような警告を与えているのでしょうか。
  3. オープンソースのクラウドディスクツール: Nextcloud 21 プライベートクラウドディスク構築
  4. よりクリーンなMicrosoft Windows 10 21H2メジャーアップデートにより、システム内の肥大化したソフトウェアの数が削減されます
  5. 996 作業システムは良いのか悪いのか?

<<:  人工知能は核爆弾と同じくらい人類にとって脅威なのでしょうか? AI脅威理論の謎を解く

>>:  「顔を見る」時代において、顔認識は「マーケティング」の共犯者にはなり得ない

ブログ    
ブログ    
ブログ    

推薦する

AIが業界全体でビジネス成果をどのように変革しているか

昨年末以来、人工知能の発展の勢いは止められないようです。 GPT-4 のような並外れた認知能力を備え...

50%-70%スリムダウン、Ctrip Taroミニプログラムサイズ削減計画

著者についてCtrip のフロントエンド開発者である Can は、現在ミニプログラムの開発に従事して...

AIの大規模導入における大きなギャップを埋めます!アリババ、テンセント、百度などが共同でインターネットサービスAIベンチマークを開始

[[276827]]今日、インターネット サービスは根本的な変化を遂げており、徐々にインテリジェント...

世界がH100を奪い合っている! Nvidia が GPU の優位性を達成、主任科学者が成功の 4 つの要素を明らかに

現在、NVIDIA は GPU の優位性の座にしっかりと座っています。 ChatGPT の誕生により...

...

「深く」「鮮明に」見る - 画像の超高精細化におけるディープラーニングの応用

[[426283]]毎日肖像画を模写する練習を続けた結果、この芸術家はいくつかの重要な特徴だけを描い...

生成AIが自動車のソフトウェア化を推進する

自動車メーカーが直面する次の大きな課題はソフトウェア化、つまりハードウェアではなくソフトウェア ソリ...

...

遅い二次アルゴリズムと高速ハッシュマップについての簡単な説明

[[424110]]こんにちは、みんな!昨日、プログラミング面接の準備をしていて、アルゴリズムの基礎...

GPT-4.5がリーク、3Dビデオをサポート、価格は6倍に上昇?ウルトラマンが自ら反応

GPT 4.5 に重大なリークの疑い: 1 つは、新しいモデルには新しいマルチモーダル機能が搭載され...

MIT スタンフォード トランスフォーマーの最新研究: 過剰トレーニングにより、中程度のモデルが構造一般化能力を「発現」できるようになる

人間にとって、文章は階層的です。文の階層構造は表現と理解の両方にとって非常に重要です。しかし、自然言...

NSAが設計した暗号化アルゴリズムは停止された

すべての RSA 暗号化システムでは、強力な暗号化キーまたは類似のキーを作成するために、ユーザーが予...

Alimama は曲率空間学習フレームワークと連合学習ソリューションをオープンソース化し、共通の進歩のために AI 技術を一般に公開します。

9月15日、Alimamaは、曲率空間学習フレームワークと連合学習ソリューションという2つのAI技...

生産効率の向上以外に、AI テクノロジーは製造業に何をもたらすのでしょうか?

現代科学技術の発展は製造業の変革と向上に新たな活力をもたらしており、人工知能技術もその一つです。 [...

...