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日

相关文章

  • C语言数据结构之二叉树详解

    C语言数据结构之二叉树详解 什么是二叉树? 二叉树是一种非常常用的数据结构,它具有以下几个特点: 在二叉树中,每个节点最多有两个子节点,其中一个称为左子节点,另一个称为右子节点。 每个节点都有一个值,这个值可以是任意类型的,比如整数、字符、指针等等。 可以使用递归的方式来遍历一个二叉树,具体包括前序遍历、中序遍历和后序遍历。 二叉树的存储方式 二叉树可以使用…

    数据结构 2023年5月17日
    00
  • CSP-何以包邮?

    题目描述 新学期伊始,适逢顿顿书城有购书满 x 元包邮的活动,小 P 同学欣然前往准备买些参考书。一番浏览后,小 P 初步筛选出 n 本书加入购物车中,其中第 i 本(1≤i≤n)的价格为 ai 元。考虑到预算有限,在最终付款前小 P 决定再从购物车中删去几本书(也可以不删),使得剩余图书的价格总和 m 在满足包邮条件(m≥x)的前提下最小。 试帮助小 P …

    算法与数据结构 2023年5月11日
    00
  • C语言实现带头结点的链表的创建、查找、插入、删除操作

    C语言实现带头结点的链表的创建、查找、插入、删除操作攻略 一、链表基本概念 链表是一种动态的数据结构,它可以在运行时动态地分配内存,支持数据的插入、删除等操作。链表(Linked List)由多个节点(Node)组成,每个节点包含两部分,一个是数据部分(Data),另一个是指向下一个节点的指针(Next)。 二、带头结点的链表 带头结点的链表是一种特殊的链表…

    数据结构 2023年5月17日
    00
  • Java 中很好用的数据结构(你绝对没用过)

    Java 中很好用的数据结构(你绝对没用过) 介绍 Java 中的数据结构有很多,比如数组、链表、栈、队列、堆、树等等。在这些常见的数据结构中,我们或多或少都会使用到。但是本篇文章要讲述的是一些比较冷门,但是很好用的数据结构。 双向队列(Deque) 双向队列,顾名思义,是一种可以双向操作的队列。它可以从队列的两端插入和删除元素,因此常被用作实现栈和队列以及…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之哈希表

    带你了解Java数据结构和算法之哈希表 前言 哈希表是一种常用的数据结构,它可以高效地存储和查询数据。在计算机科学领域,哈希表广泛用于实现关联数组(Associative Array)和哈希集合(Hash Set)。本文将带领大家深入了解哈希表数据结构及常用算法实现。 哈希表的原理 哈希表是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说…

    数据结构 2023年5月17日
    00
  • C语言程序设计第五版谭浩强课后答案(第二章答案)

    首先,需要说明的是本题涉及到一个特定的知识领域,即C语言程序设计,以及该领域内某个具体教材的课后习题解答。因此,本攻略的重心将放在如何利用Markdown格式对该领域内的知识进行准确、清晰的表达和展示上。 下面是本攻略的目录: C语言程序设计第五版谭浩强课后答案(第二章答案)攻略 一、简介 二、题目列表 三、示例说明 示例一 示例二 四、总结 一、简介 本攻…

    数据结构 2023年5月17日
    00
  • Mysql Innodb存储引擎之索引与算法

    Mysql Innodb存储引擎之索引与算法 MySQL是一款非常受欢迎的关系型数据库,有许多的存储引擎可供选择,其中InnoDB是目前最受欢迎的存储引擎之一。索引是InnoDB存储引擎的一个重要特性,它可以大大提高数据库查询的效率。本文将详细讲解InnoDB存储引擎的索引与算法。 索引 索引是一种数据结构,它将表中的列与对应的行位置组成键值对,以便快速查找…

    数据结构 2023年5月17日
    00
  • C语言线性表全面梳理操作方法

    C语言线性表全面梳理操作方法 线性表概述 线性表是一种常用的数据结构,是指数据元素之间存在一定逻辑顺序,每个元素都有唯一的前驱和后继。 线性表有两种存储方式: 顺序存储结构 和 链式存储结构。 顺序存储结构 顺序存储结构是指采用顺序存储方式存储线性表,即将线性表的元素依次存储在一段连续的存储空间内。 代码示例:创建顺序存储线性表 #define MaxSiz…

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