ハッシュテーブル(ハッシュ)

  1. 実需を参照してください。

グーグルのマシン上の問題

会社があり時間を報告するための新しい従業員が従業員の情報が付加されていることを要求した(ID、性別年齢住所は...)、従業員の入力時にIDの時間が見つけることが従業員を必要とするすべての情報を

要件データベースを使用していないがメモリを節約しようとより速く、より良い=> ハッシュテーブルハッシュ

  1. 基本的な導入・ハッシュ・テーブル

ハッシュテーブル(ハッシュテーブルのキーコード値に基づいて、また、ハッシュ・テーブルと呼ばれる)、 キー値)を直接データ構造にアクセスします。つまり、キー値によってレコードにアクセスするには、テーブルに検索をスピードアップするために位置をマッピングされます。ストレージアレイを記録し、ハッシュ関数と呼ばれるこのマッピング関数は、ハッシュテーブルと呼ばれます。

  1. アプリケーション例
  • グーグルのマシン上の問題

会社があり時間を報告するための新しい従業員が従業員の情報が付加されていることを要求した(ID、性別年齢住所は...)、従業員の入力時にIDの時間が見つけることが従業員を必要とするすべての情報を

  • 要件
  1. データベースを使用せずに,, より速く、より良い=> ハッシュテーブルハッシュ
  2. あなたがに従い、保証を追加すると、ID 高い挿入ロー[ 放課後思考:場合はidがローからハイに挿入されたが、依然として低から高への各リンクリストを必要とされていない、どのように解決するために?]
  3. ハッシュ・テーブル・リストを使用して実装メータなく、このリスト
        [
    すなわち従業員情報を格納するリストの最初のノード]
  • 概略的なアイデアの分析とドロー

コードの実装[ CRUD によると、全従業員を表示するのid クエリー)]

  • コードの実装

パッケージcom.atguigu.chapter18.hashtab

 

輸入scala.io.StdIn

輸入util.control.Breaks._

 

オブジェクトHashTabDemo {

DEFメイン(引数:配列[文字列]):単位= {

// 作成HashTabを

ヴァルhashTab =新しいHashTab(7)

// シンプルなメニューを書きます

VARキー= ""

一方、(TRUE){

println( "追加:従業員を追加します。")

println(「リスト:従業員を表示します」)

println("find: 查找雇员")

println("exit: 退出系统")

 

key = StdIn.readLine()

key match {

case "add" => {

println("输入id")

val id = StdIn.readInt()

println("输入名字")

val name = StdIn.readLine()

val emp = new Emp(id, name)

hashTab.add(emp)

}

case "find" => {

println("输入要查找的雇员的id")

val id = StdIn.readInt()

hashTab.findEmpById(id)

}

case "list" => {

hashTab.list()

}

}

 

}

}

}

 

//创建Emp

class Emp(eId: Int, eName: String) {

val id = eId

var name = eName

var next: Emp = null

}

 

//创建EmpLinkedList

class EmpLinkedList {

//定义头指针, 这里head 我们直接回指向一个雇员

var head: Emp = null

 

//添加雇员方法

//假定,添加的雇员的id是自增的,即雇员分配的id总是从小到大

//找到链表的最后加入即可

def add(emp: Emp): Unit = {

 

//如果是第一个雇员

if (head == null) {

head = emp

return

}

//定义辅助指针

var cur = head

 

breakable {

while (true) {

if (cur.next == null) {

break()

}

cur = cur.next

}

}

//这时cur 指向了链表的最后

cur.next = emp

 

}

 

//遍历链表的方法

def list(i: Int): Unit = {

if (head == null) {

println(s"${i}条链表为空")

return

}

 

print(s"${i}条链表信息为\t")

//定义辅助指针

var cur = head

breakable {

while (true) {

if (cur == null) {

break()

}

//输出雇员信息

printf(" => id=%d name=%s\t", cur.id, cur.name)

cur = cur.next //

}

}

println()

}

 

//如果有,返回emp ,没有返回null

def findEmpById(id: Int): Emp = {

//遍历

if (head == null) {

println("链表为空,没有数据~~")

return null

}

 

var cur = head

 

breakable {

while (true) {

if (cur == null) {

break()

}

if (cur.id == id) {

break()

}

cur = cur.next

}

}

return cur

}

}

 

//size = 700

class HashTab(val size: Int) { //size 会称为只读属性

val empLinkedListArr: Array[EmpLinkedList] = new Array[EmpLinkedList](size)

//初始化我们的empLinkedListArr 的各个元素

for (i <- 0 until size) {

empLinkedListArr(i) = new EmpLinkedList

}

 

def add(emp: Emp): Unit = {

//返回该员工,应该加入到那条链表

val empLinkedListNo = hashFun(emp.id)

empLinkedListArr(empLinkedListNo).add(emp)

}

 

def list(): Unit = { //遍历整个hash

for (i <- 0 until size) {

empLinkedListArr(i).list(i)

}

}

 

//编写一个findEmpById

def findEmpById(id:Int): Unit = {

//返回该员工,应该加入到那条链表

val empLinkedListNo = hashFun(id)

val emp = this.empLinkedListArr(empLinkedListNo).findEmpById(id)

if (emp!=null) {

printf(s"在第 $empLinkedListNo 找到id=%d name=%s\n", id, emp.name)

}else{

printf("没有找到id %d \n", id)

}

}

//散列函数, 可以定制

def hashFun(id: Int): Int = {

id % size

}

}

 

  • 晚上完成的任务
  1. 能够写出一个hashtab
  2. 解决插入的雇员id 的顺序是从小到大, 而且不能重复

     

     

     

おすすめ

転載: www.cnblogs.com/shuzhiwei/p/11210072.html