忘记您所知道的关于字符串搜索的一切 – 尝试会让您大吃一惊!

忘记您所知道的关于字符串搜索的一切 - 尝试会让您大吃一惊!

trie数据结构简介

trie,也称为前缀树,是一种高效的树状数据结构,用于存储和检索字符串。它对于涉及字符串搜索、前缀匹配和自动完成功能的任务特别有用。

发音:

这是一个单音节词末尾的“ie”发音为长“e”音,类似于“see”或“tree”它与“pie”或“die”不押韵这种发音有助于将其与其他外观相似的单词区分开来,并强调其与数据检索操作的联系。

何时使用 trie

在您需要以下情况的情况下尝试是理想的选择:

快速执行基于前缀的搜索实现自动完成功能存储单词词典以进行拼写检查高效存储和检索具有公共前缀的字符串## 可视化 trie

让我们想象一个包含单词“cat”、“car”和“dog”的特里树:

       root     /   |       c    d    ...   /     |  a      o /      |t   r    g

每个节点代表一个字符,从根节点到叶节点的路径组成完整的单词。

在 javascript 中实现 trie

让我们用 javascript 实现一个基本的 trie 结构:

class TrieNode {  constructor() {    this.children = {};    this.isEndOfWord = false;  }}class Trie {  constructor() {    this.root = new TrieNode();  }  // Insert a word into the trie  insert(word) {    let node = this.root;    for (let char of word) {      if (!node.children[char]) {        node.children[char] = new TrieNode();      }      node = node.children[char];    }    node.isEndOfWord = true;  }  // Search for a word in the trie  search(word) {    let node = this.root;    for (let char of word) {      if (!node.children[char]) {        return false;      }      node = node.children[char];    }    return node.isEndOfWord;  }  // Check if any word starts with the given prefix  startsWith(prefix) {    let node = this.root;    for (let char of prefix) {      if (!node.children[char]) {        return false;      }      node = node.children[char];    }    return true;  }}// Example usageconst trie = new Trie();// Insert wordstrie.insert("apple");trie.insert("app");trie.insert("banana");console.log(trie.search("apple"));    // Output: trueconsole.log(trie.search("app"));      // Output: trueconsole.log(trie.search("appl"));     // Output: falseconsole.log(trie.startsWith("app"));  // Output: trueconsole.log(trie.startsWith("ban"));  // Output: trueconsole.log(trie.startsWith("cat"));  // Output: false

守则解释

class trienode:表示 trie 中的一个节点。每个节点都有:: 一个用于存储子节点的对象: 一个布尔标志,用于标记单词的结尾 class trie:主要的 trie 结构及其方法:插入:向特里树添加一个单词搜索:检查单词是否存在于 triestartswith:检查 trie 中是否有任何单词以给定前缀开头该方法遍历 trie,为不存在的字符创建新节点,并将最后一个节点标记为单词的结尾。该方法沿着给定单词的路径遍历 trie,如果找到整个单词并将其标记为完整单词,则返回。该方法类似,但只检查给定的前缀是否存在于 trie 中,而不管它是否是一个完整的单词。

时间和空间复杂度

时间复杂度:插入:o(m),其中 m 是单词的长度搜索:o(m),其中 m 是单词的长度startswith:o(m),其中 m 是前缀的长度空间复杂度:o(n * m),其中n是单词数,m是单词的平均长度

tries 为字符串相关操作提供了出色的性能,特别是在处理大量具有公共前缀的单词时。它们提供快速查找和前缀匹配,这使得它们在自动完成系统、ip 路由表和字典实现等各种应用中具有无价的价值。

如果您喜欢本教程,请在此处关注我,并在 x/twitter 上关注我:@turckalicious。本文是在 wonderfall (https://wonderfall.xyz) 的帮助下完成的,这是一款人工智能驱动的交互式文档编辑器,可帮助您更快地研究、写作和迭代。

以上就是忘记您所知道的关于字符串搜索的一切 – 尝试会让您大吃一惊!的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491675.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 14:10:31
下一篇 2025年12月19日 14:10:46

相关推荐

  • JavaScript 中临时视图状态的概念

    大家好!在本文中,我们将讨论一个相当不寻常的主题,由于某种原因我没有找到有关该主题的信息,尽管它在现代 javascript 框架和用于创建用户界面的库中非常有用,因为在某些情况下,应用该概念可以帮助将 dom 的处理速度提高数倍。 名称是有条件的,但本质很重要。 平时状态的问题 术语“通常状态”是…

    好文分享 2025年12月19日
    000
  • 如何在 JavaScript 中展平数组

    使用递归和 while 循环是实现此目的的更简单方法 export default function flatten(value) { const arr = [] const flat = (a) => { let counter = 0 console.log(a) while (coun…

    2025年12月19日
    000
  • 掌握 JavaScript 中的函数表达式

    函数表达式是 javascript 中定义函数的一种方式。与函数声明不同,函数表达式可以是匿名的,并且通常用于将函数视为值的情况。在本博客中,我们将探讨函数表达式、如何将函数视为值、回调函数以及函数表达式和函数声明之间的差异。让我们潜入吧! 函数表达式 函数表达式将函数定义为更大表达式的一部分。函数…

    2025年12月19日
    000
  • 天花板:增强美观和声学效果

    天花板是一种多功能解决方案,可以提高任何空间的美观性和声学性能。它们有多种材料、样式和饰面可供选择,有助于控制声音、降低噪音水平并打造具有视觉吸引力的天花板。吊顶板非常适合住宅、商业和机构环境,具有功能和设计优势,包括改进的隔热性和易于安装。它们是打造现代、优雅的室内装饰,同时提高舒适度和音响效果的…

    2025年12月19日
    000
  • 盖茨比中的数据显示

    gatsby 是一个基于 react 的强大静态站点生成器,使开发人员能够构建快速且可扩展的网站和应用程序。构建有效网站的关键方面之一是向用户有效地显示数据。在 gatsby 中,可以结合使用 graphql、react 组件和 headless cms、api 和本地文件等第三方数据源来实现数据显…

    2025年12月19日 好文分享
    000
  • 掌握 JavaScript 中的箭头函数

    es6 中引入的箭头函数为编写函数提供了更简洁的语法。它们对于编写内联函数特别有用,并且与传统函数表达式相比具有一些独特的行为。在本博客中,我们将介绍箭头函数的基础知识、它们的代码结构、特殊功能以及它们如何与各种 javascript 结构交互。 箭头函数的基础知识 箭头函数使用 => 语法定…

    2025年12月19日
    000
  • Promiseall( ) 困境:什么时候有帮助,什么时候有害

    在现代 javascript 开发中,处理异步操作是一项常见任务。无论是发出 api 请求、查询数据库还是读取文件,使用异步代码几乎是不可避免的。开发人员遇到的常见工具之一是 promise.all()。然而,我们中的许多人,包括我自己,可能会陷入尝试使用 promise.all() 的陷阱,只是因…

    2025年12月19日
    000
  • 将 Cloudinary 集成到 Nextjs 应用程序中

    了解 cloudinary 及其定价。 1. 创建一个cloudinary账户 在 cloudinary 注册并创建一个新帐户(如果您没有)。 2.安装cloudinary sdk 您可以使用npm或yarn安装cloudinary sdk: npm install cloudinary 3. 配置…

    2025年12月19日
    000
  • React 中使用 visx 的圆环图

    您好,在本指南中,我们将学习如何使用 visx 创建进度圆环图。甜甜圈图是饼图的变体,具有中心孔,类似于甜甜圈。 理解数学 为了有效地实现我们图表的功能,必须掌握其背后的数学原理。该图表是一个 360 度或 2 * pi 弧度的圆。以下是我们确定每个进度段的角度的方法: 2 * pi / (numb…

    2025年12月19日
    000
  • 适用于您日常工作流程的 ESEST 提示、技巧、最佳实践和代码片段示例

    es6 (ecmascript 2015) 对 javascript 进行了重大改革,引入了许多新功能,可以简化您的编码并提高项目的整体质量。 在这篇文章中,我们将介绍一些es2015 提示、技巧、最佳实践,并提供代码片段示例来增强您的日常工作流程。 1. 声明变量:let 和 const 与 va…

    2025年12月19日
    000
  • 如何在 React 中访问提供者外部的上下文时处理错误

    使用 react 的 context api 时,处理组件尝试访问 provider 外部上下文的情况非常重要。如果不这样做,可能会导致意想不到的结果或难以跟踪的错误。 问题当您使用 createcontext() 创建上下文时,您可以选择传递默认值。如果组件尝试访问提供程序外部的上下文,则返回此默…

    2025年12月19日
    000
  • Javascript Slice 方法及其示例

    什么是 javascript 数组切片? array.prototype.slice 是一个 js array 方法,用于从现有数组中提取连续的子数组或“切片”。 javascript 切片可以接受两个参数:切片的开始和结束指示符——两者都是可选的。也可以在没有任何参数的情况下调用它。因此,它具有以…

    2025年12月19日
    000
  • 掌握 JavaScript 中的循环:`while`、`dowhile` 和 `for`

    在本博客中,我们将探讨 javascript 中不同类型的循环:while、do…while 和 for。我们还将介绍如何跳出循环、继续下一次迭代以及使用标签来实现更复杂的控制流。让我们潜入吧! while 循环 只要指定条件为真,while 循环就会继续执行。 语法: while (c…

    2025年12月19日
    000
  • 为什么 JavaScript 在 OG Webapp King 初学者指南中仍然相关

    介绍 啊,JavaScript。这种编程语言永不过时,就像 90 年代的一支乐队不断发行无人问津的专辑 – 但不知何故,我们一直在听。如果您是 Web 开发新手,或者只是好奇为什么 JavaScript 在 2024 年仍然流行,那么您来对地方了。因此,请系好安全带,喝杯咖啡(或能量饮料…

    2025年12月19日
    000
  • 在 NGINX 上托管 Angular 应用程序的终极指南

    在 nginx 服务器上托管 angular 应用程序可以增强性能,提供更好的安全性,并为生产环境提供更轻松的配置。以下是在 nginx 上部署 angular 应用程序的分步指南。 先决条件 已安装 nginx:确保您的服务器上安装了 nginx。您可以使用以下命令将其安装在基于 linux 的系…

    2025年12月19日
    000
  • 掌握 React:提出伟大问题的艺术

    掌握 React:提出伟大问题的艺术 作为一名 React 开发人员,你可以培养的最有价值的技能之一就是提出好问题的能力。你不需要了解 React 的一切才能发挥作用,但你确实需要知道如何深思熟虑地处理问题。这项技能是优秀工程师与伟大工程师的区别。 可视化:React 组件树 将您的 React 应…

    2025年12月19日
    000
  • JavaScript For 循环示例

    标准 for 循环 for (let i = 0; i < 5; i++) { console.log(`iteration ${i + 1}`);} for…of 循环(遍历数组) const fruits = [‘apple’, ‘banana’, ‘orange’];for …

    2025年12月19日
    000
  • 使用 Secrets Loader 轻松管理 Laravel 和 JS 项目

    跨各种环境管理 api 密钥、令牌和凭证等敏感数据可能非常棘手,尤其是在开发和部署应用程序时。确保秘密在需要时安全地存储和获取,而不是将它们硬编码到版本控制中,对于维护安全性至关重要。 这就是我创建 secrets loader 的原因,这是一个 bash 脚本,可以动态地将 aws ssm 和 c…

    2025年12月19日
    000
  • 编码面试中解决问题的终极指南

    面试问题编码的常见策略 两个指针 两个指针技术经常被用来有效地解决数组相关的问题。它涉及使用两个指针,它们要么朝彼此移动,要么朝同一方向移动。 示例:在排序数组中查找总和为目标值的一对数字。 /** * finds a pair of numbers in a sorted array that s…

    2025年12月19日
    000
  • 创建对外部存储库的拉取请求

    本周的重点是实验 2,其中涉及通过创建拉取请求 (pr) 为我不拥有的存储库做出贡献。我首先选择一个同学的存储库来进行工作。鉴于 javascript 是我的主要编程语言,我选择了基于 javascript 的存储库来简化我的工作流程。虽然我愿意探索其他语言,但我选择 js 项目节省了时间,让我可以…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信