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脅威理論の謎を解く

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

推薦する

人工知能医療機器業界は前進する

[[443093]]新世代の人工知能技術の台頭は、医療業界にインテリジェント変革を実現するための新た...

デジタルコンテンツ制作のためのDIY AI

背景今年、chatgpt に代表される大型モデルの驚異的なパフォーマンスは、AICG の分野に完全に...

専門家の見解:規制されていないAIは倫理的な偏見を生み出す可能性がある

透明性は、倫理的なビジネス上のジレンマにおいて重要な役割を果たすことがよくあります。情報が多いほど、...

AI搭載のレンガ積みロボットが建設業界に革命を起こす

現在、建設部門は大規模なプロジェクトによって活性化しており、大きな成長を牽引しています。しかし、これ...

マイクロソフト、機械学習モデル向けの高性能推論エンジン ONNX をオープンソース化

Microsoft は、Linux、Windows、Mac プラットフォーム向けの ONNX 形式の...

Oracle データベース初期化パラメータの分析: システム構成を最適化するための究極のガイド!

Oracle データベースでは、初期化パラメータは非常に重要な構成項目であり、データベースのパフォ...

建設ロボット代替の流れが到来。高齢化した移民労働者はどこへ行くのか?

長年にわたり、数億人の出稼ぎ労働者が経済建設と社会発展に積極的に参加し、中国の近代化推進に多大な貢献...

ChatGPT: 機械学習とディープラーニングを簡単かつ楽しく

ディープラーニングと機械学習は、今日のテクノロジーのホットな話題ですが、初心者にとっては少し複雑で難...

...

AI時代に人間が持つべき9つのソフトスキル。あなたはいくつ持っていますか?

今日の人工知能、ビッグデータ、自動化の時代では、技術的なスキルとデータリテラシーが非常に重要です。し...

イメージフリーの認識がさらに一歩前進! ScalableMap: 大規模高精度地図に向けた新しいソリューション!

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

...

テクノロジートレンド: 2024 年に流行するものは何でしょうか?

人々は、たとえすべてを正しく行えなかったとしても、毎年年末には必ず将来を楽しみにするものです。今年は...