TypeScript 基础数据结构哈希表 HashTable教程

TypeScript 基础数据结构哈希表 HashTable 教程

什么是哈希表 HashTable

在计算机科学中,哈希表(HashTable),也叫散列表,是根据关键码值(Key­value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫作哈希函数,存放记录的数组叫作哈希表。

如何实现哈希表 HashTable

哈希表的实现过程主要包括两步,哈希函数的设计和哈希冲突的解决。

哈希函数的设计

哈希函数将不同的值映射到不同的位置,因此哈希函数的设计是哈希表的重要部分。常见的哈希函数包括除数取余法、乘法取整法、数字分析法等等。

以下是一个使用除数取余法实现的简单哈希函数:

function hashFn(key: string, length: number): number {
  let total = 0
  for (let i = 0; i < key.length; i++) {
    total += key.charCodeAt(i)
  }
  return total % length
}

该函数的输入参数为一个字符串类型的键值 key 和表的长度 length,输出参数为该键值在表中的位置。该哈希函数的实现过程为求出字符串的 ASCII 码值总和并对表长取余。

哈希冲突的解决

由于哈希函数的映射过程是将多个不同的输入映射到同一个哈希值,因此可能会存在不同的输入具有相同的哈希值的情况,这种现象称为哈希冲突。常见的哈希冲突解决方法包括拉链法和线性探测法等等。

以下是一个使用拉链法实现的哈希表:

class HashTable {
  private storage: any[]
  private length: number

  constructor() {
    this.storage = []
    this.length = 0
  }

  private hashFn(key: string, length: number): number {
    let total = 0
    for (let i = 0; i < key.length; i++) {
      total += key.charCodeAt(i)
    }
    return total % length
  }

  public getItem(key: string): any {
    const index = this.hashFn(key, this.length)
    if (!this.storage[index]) {
      return null
    }
    for (let i = 0; i < this.storage[index].length; i++) {
      if (this.storage[index][i][0] === key) {
        return this.storage[index][i][1]
      }
    }
    return null
  }

  public setItem(key: string, value: any): void {
    const index = this.hashFn(key, this.length)
    if (!this.storage[index]) {
      this.storage[index] = []
    }
    for (let i = 0; i < this.storage[index].length; i++) {
      if (this.storage[index][i][0] === key) {
        this.storage[index][i][1] = value
        return
      }
    }
    this.storage[index].push([key, value])
    this.length++
  }

  public removeItem(key: string): void {
    const index = this.hashFn(key, this.length)
    if (!this.storage[index]) {
      return
    }
    for (let i = 0; i < this.storage[index].length; i++) {
      if (this.storage[index][i][0] === key) {
        this.storage[index].splice(i, 1)
        this.length--
        return
      }
    }
  }
}

该实现使用了数组来存储哈希表,并使用拉链法来解决哈希冲突。

哈希表 HashTable 的应用场景

哈希表的高效性能使其被广泛应用于各种场景中,例如:

  • 缓存
  • 数据库索引
  • 语法分析器

示例说明

示例一

const hashTable = new HashTable()
hashTable.setItem('name', '张三')
hashTable.setItem('age', 20)

console.log(hashTable.getItem('name')) // 输出:张三
console.log(hashTable.getItem('age')) // 输出:20

hashTable.removeItem('age')
console.log(hashTable.getItem('age')) // 输出:null

以上示例创建了一个哈希表,并向其中添加了两个键值对 "name": "张三""age": 20。随后,示例中通过 getItemremoveItem 方法获取和移除了其中的一个键值对,并分别输出了获取结果。

示例二

const products = [
  { name: 'iPhone', price: 8000 },
  { name: 'iPad', price: 6000 },
  { name: 'MacBook', price: 20000 }
]

const hashTable = new HashTable()
products.forEach(product => hashTable.setItem(product.name, product.price))

console.log(hashTable.getItem('iPhone')) // 输出:8000
console.log(hashTable.getItem('iPad')) // 输出:6000
console.log(hashTable.getItem('MacBook')) // 输出:20000

以上示例将一个商品数组转换为一个哈希表,并通过 setItem 方法将商品名称作为键值,商品价格作为值存储在哈希表中。随后,示例中通过 getItem 方法获取了其中三个商品的价格并分别输出了获取结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:TypeScript 基础数据结构哈希表 HashTable教程 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 「学习笔记」BSGS

    「学习笔记」BSGS 点击查看目录 目录 「学习笔记」BSGS Baby-step Giant-step 问题 算法 例题 Discrete Logging 代码 P3306 [SDOI2013] 随机数生成器 思路 P2485 [SDOI2011]计算器 思路 Matrix 思路 代码 Baby-step Giant-step 问题 在 \(O(\sqrt…

    算法与数据结构 2023年4月17日
    00
  • 手撕HashMap(二)

    这里再补充几个手撕HashMap的方法 1、remove() remove 方法参数值应该是键值对的键的值,当传入键值对的键的时候,remove 方法会删除对应的键值对 需要利用我们自己先前创建的 hashcodeList 来实现,hashcodeList 存入了所有被使用的 hashcode 值,方便后续的操作 在 put() 中,当添加新的键值对时,就会…

    算法与数据结构 2023年4月18日
    00
  • C++超详细讲解单链表的实现

    首先我们来了解一下单链表的概念。 单链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由节点所组成的数据结构,其中每个节点都包含两部分,一个是存储数据的元素,另一个是指向下一个节点的指针。单链表的首节点被称为头部,而最后一个节点则被称为尾部。单链表可以通过在头部插入和删除元素来实现高效地数据操作。接下来我们将讲解如何实现一个 C++ 版的单链表。 实现…

    数据结构 2023年5月17日
    00
  • C语言数据结构之算法的时间复杂度

    关于C语言数据结构之算法的时间复杂度,需要先了解一些基本概念。 什么是时间复杂度 时间复杂度是算法的一种衡量标准,用于评估算法的执行效率。表示代码执行的时间和数据量之间的关系,通常用大O符号来表示,称为“大O记法”。 时间复杂度的分类 时间复杂度可分为以下几类: 常数阶:O(1) 对数阶:O(log n) 线性阶:O(n) 线性对数阶:O(n log n) …

    数据结构 2023年5月17日
    00
  • Java数据结构之线索化二叉树的实现

    Java数据结构之线索化二叉树的实现 线索化二叉树的概述 线索化二叉树(Threaded Binary Tree)是一种优化的二叉树结构。它的优点是可以在O(n)的时间复杂度内,进行中序遍历。而在普通二叉树中进行中序遍历需要的时间复杂度是O(nlogn)。线索化二叉树的原理是利用空闲的指针域,来记录中序遍历中前驱与后继结点的位置。线索化二叉树中会出现两种类型…

    数据结构 2023年5月17日
    00
  • Python数据结构之双向链表详解

    Python数据结构之双向链表详解 什么是双向链表? 在计算机科学中,双向链表是链表的一种,每个结点除了储存下一个结点的指针外,还储存着前一个结点的指针。这个“前进”指针被称为“ next指针”,而“后退”指针被称为“previous指针”。 双向链表和单向链表的区别在于,单向链表的每个结点只储存一个指向下一个结点的指针,而双向链表储存了前一个和后一个结点的…

    数据结构 2023年5月17日
    00
  • Redis数据结构原理浅析

    Redis数据结构原理浅析 Redis是一种高性能键值型数据库,支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。本文将对Redis各种数据结构的原理进行浅析。 字符串 Redis中的字符串数据结构不仅可以存储普通的字符,还可以存储整数和浮点数。字符串的最大长度为512MB。字符串结构的底层实现是从一个内存块开始存储的,该内存块的大小为实际存储的…

    数据结构 2023年5月17日
    00
  • C语言学习之链表的实现详解

    下面我将详细讲解“C语言学习之链表的实现详解”的完整攻略。 1. 链表的定义 链表是一种数据结构,它由一系列节点组成。每个节点由一个数据部分和一个指向下一个节点的地址部分组成。链表可以有多种形式,例如单向链表、双向链表、循环链表等。 2. 链表的实现 2.1. 单向链表 单向链表是最简单的链表形式,一个节点只包含一个指向下一个节点的指针。在C语言中,我们可以…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部