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と機械学習を活用して工場の安全を守る

自動化されたセキュリティの将来には機械学習が関与するでしょう。人工知能と機械学習の進歩により、ロボッ...

5Gヘルスケアの7つの未来

病院が導入する医療機器やモバイルデバイスが増えるにつれて、医療システムの IT インフラストラクチャ...

人工知能はビッグデータの保存と管理の効率をどのように向上させるのでしょうか?

ビッグデータのソースが多数存在し、企業が利用できるデータの量も増加しているため、ストレージ管理者にと...

自動運転車にロボットが殺される、これは今後ますます増えるかもしれない

CES ではさまざまな新技術が注目を集めようと競い合っていたが、同じ場所で悲劇が起きた。自動運転モー...

企業に利益をもたらす 5 つの AI トレンド

市場の状況がますます複雑化する今日の不安定なビジネス環境では、組織が分析に基づく意思決定を行うために...

テクノロジーはどのようにして人々を怠惰にするのでしょうか?

過去数十年にわたり、技術の進歩は私たちの生活、仕事、コミュニケーションの方法に革命をもたらしました。...

Apple: 画像モデルの事前トレーニングに言語モデルの自己回帰アプローチを使用する

1. 背景GPTなどの大規模モデルの登場後、言語モデルのTransformer +自己回帰モデリング...

VRシルキーパノラマはもうすぐそこ? Googleの360°NeRFは人々に未来を垣間見せる

少し前に、CVPR 2022 が今年の論文採択結果を発表しましたが、これは提出された論文がようやく沈...

...

これらのブラウザのAI拡張機能は素晴らしい

ご存知のとおり、拡張機能を追加することによってのみ、ブラウザは最大限の可能性を発揮し、効率を 2 倍...

...

...