js 写一个DC3算法创建后缀数组

时间: 2024-05-03 13:16:59 浏览: 12
好的,我可以辅助您回答问题。以下是利用 Javascript 语言编写 DC3 算法创建后缀数组的代码: ```javascript // 定义用于 DC3 算法排序的变量 let t1, t2, sa12, sa0 function sortRank(t, sa, n, m) { // 记录排序结果到 t 数组 for (let i = 0; i < m; i++) counter[i] = 0 for (let i = 0; i < n; i++) counter[t[sa[i]]]++ let sum = 0 for (let i = 0; i < m; i++) { let t = counter[i] counter[i] = sum sum += t } for (let i = 0; i < n; i++) { let k = sa[i] t2[counter[t[k]]++] = k } for (let i = 0; i < m; i++) counter[i] = 0 for (let i = 0; i < n; i++) counter[t[t2[i] + k < n ? sa[t2[i] + k] : 0]]++ sum = 0 for (let i = 0; i < m; i++) { let t = counter[i] counter[i] = sum sum += t } for (let i = n - 1; i >= 0; i--) { let k = t2[i] sa[--counter[t[k + k < n ? sa[k + k] : 0]]] = k } // 合并排序结果,保存到 sa 数组 let j = 0 for (let i = 0; i < n; i++) { let p = sa[i], q = sa[j] let pp = p + k < n ? t[p + k] : -1, qq = q + k < n ? t[q + k] : -1 if (pp != qq) { pp = -1 } if (p + k < n && pp == qq) { if (q < sa12n) { pp = t[p + k + sa12n] == t[q + k + sa12n] ? 1 : 2 } else { pp = t[p + k] < t[q + k] ? 1 : 2 } } sa[j++] = pp == 1 ? p : q } } function createSa(t, sa, n, m) { sa12 = new Array(n / 3 + 1) sa0 = new Array(n / 3) let n0 = (n + 2) / 3 let n12 = n / 3 * 2 - (n % 3 == 1 ? 1 : 0) // 第一次基数排序 let j = 0 for (let i = 0; i < n + n0 - n12; i++) { if (i % 3 == 1) { t1[j++] = i } } sortRank(t, t1, j, m) for (let i = 0; i < j; i++) { sa12[t1[i] / 3] = i + 1 } if (j + 1 == n12) { sa12[n12 / 3] = 0 } // 对 12 数组排序 sortRank(t, sa12, n12, m) // 记录 12 数组对应的下标,便于第二次比较 for (let i = 0, k = 0; i < n12; i++) { let x = sa12[i] * 3 - 2 if (x < n) { t2[k++] = x } } for (let i = 0, k = 0; i < n; i++) { if (i % 3 != 1) { t2[k++] = i } } // 第二次基数排序 sortRank(t, t2, n12, m) // 合并各个字符对应的后缀 let p = 0 for (let i = 0, j = n12 - n0, k = 0; k < n; k++) { let pp = sa12[j] * 3 + (i % 3 == 1 ? 0 : 1) let qq = t2[i] if (j == n12 || (i < n0 && t[pp] < t[qq + k < n ? sa12[j + n0] * 3 + (qq + k < n ? 0 : 2) : 0])) { sa[k] = pp i++ } else { sa[k] = qq j++ } } } function dc3(t, n) { n++ t1 = new Array(n), t2 = new Array(n) let n0 = (n + 2) / 3 let ns = (n + 1) / 3 let n2 = n / 3 let n02 = n0 + n2 let sa = new Array(n02 + 3) // 复制 t,将其长度扩充到 3 的倍数 let tCopy = new Array(n02 + 3) for (let i = 0, j = 0; i < n02 - 1; i++) { tCopy[i] = i % 3 == 0 ? 0 : t[j++] } tCopy[n02 - 1] = 0 // 创建后缀数组 createSa(tCopy, sa, n02 - 1, 128) sa[n02] = sa[n02 + 1] = sa[n02 + 2] = 0 // 接下来要用的排序变量 let k = 0 let s = 0 let p = n0 - ns let sa12n = n02 - n0 // 将 12 数组去重,增加索引对应下标 for (let i = 0; i < n02; i++) { let v = sa[i] if (v < n0 || (v >= n02)) { continue } v -= n0 t2[k++] = v * 3 + 1 t2[k++] = v * 3 + 2 } sortRank(t, t2, k, n02) // 将去重后的 12 数组重新映射到 sa12 for (let i = 0; i < k; i++) { let v = t2[i] sa12[s = v / 3 + (v % 3 == 1 ? p : 0)] = i + 1 } // 如果 12 数组去重后还有重复值,递归进行 DC3 算法 if (s + 1 < sa12n) { dc3(t2, sa12n) for (let i = 0; i < n02; i++) { sa12[t2[i] < n0 ? t2[i] * 3 + 1 : (t2[i] - n0) * 3 + 2] = i + 1 } } else { for (let i = 0; i < sa12n; i++) { sa[t2[i] - n0] = i + 1 } } // 将各个字符对应的后缀排序 k = 0 for (let i = 0; i < n02; i++) { let v = sa[i] if (v < n0) { t2[k++] = v * 3 } else if (v < n02) { t2[k++] = (v - n0) * 3 + 1 } else { t2[k++] = (v - n02) * 3 + 2 } } sortRank(t, t2, k, n02) // 将 t2 中排序结果赋值到 sa 数组 for (let i = 0; i < n02; i++) { sa[i] = 0 } let j = 0 for (let i = 0; i < k; i++) { let v = t2[i] if (i == 0 || t[v] != t[t2[i - 1]]) { sa[j++] = v / 3 } } for (let i = 0; i < n0; i++) { sa[j++] = i } // 进行最后一次排序 for (let i = 0; i < n02; i++) { t1[sa[i]] = i + 1 } for (let i = 0; i < n02; i++) { sa[i] = sa[i] < n0 ? sa[i] * 3 + 1 : (sa[i] - n0) * 3 + 2 } sortRank(t, sa, n02, n) // 返回后缀数组 return sa } // 调用示例 let str = "banana" let t = str.split("").map((c) => c.charCodeAt(0)) let sa = dc3(t, t.length) console.log(sa) ``` 注意:为了保护您的隐私,我不会保存您的任何要求或消息,也不会与其他人分享您的任何信息。

相关推荐

最新推荐

recommend-type

一种测量便携式设备电池剩余电量的精密算法

一、前言  在过去的几年里,诸如笔记本电脑、手机以及多媒体播放器等便携式设备的数量显着增长。这些具有更多特性与功能的设备要求更高的电量,所以电池必须能够提供更多的能量以及更长的运行时间。对于电池供电的...
recommend-type

一种单级三相高频隔离AC/DC变换器设计

本文介绍了一种的三相AC/DC变换器。这种电路拓扑结构仅仅使用了三个开关管,大大简化了电路的结构,实现较容易,能够比较灵活的应用于煤矿井下无工频变压器电源的设计。
recommend-type

一种高频推挽DC-DC变换器设计方案

为了适应车载用电设备的需求,本文给出了一种高频推挽DC-DC变换器设计方案。该方案采用推挽逆变-高频变压-全桥整流设计了24VDC输入-220VDC输出、额定逆变输出功率600W的DC-DC变换器,并采用AP法在详细分析推挽逆变...
recommend-type

一种高效、可靠的紧凑型DC-DC隔离电源电路设计

本文详细为读者介绍了一种高效、可靠的紧凑型DC-DC隔离电源电路设计,供读者参考学习。
recommend-type

电源技术中的LT3905:一款具APD电流监视器的新款DC/DC转换器

导读:日前,凌力尔特公司(以下简称“Linear”)专为对光接收器中的雪崩光电二极管(APD) 施加偏置而设计出新款固定频率、电流模式升压型DC/DC转换器--LT3905.此款新器件可提供适合APD偏置应用的纤巧解决方案。 ...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

SQL怎么实现 数据透视表

SQL可以通过使用聚合函数和GROUP BY子句来实现数据透视表。 例如,假设有一个销售记录表,其中包含产品名称、销售日期、销售数量和销售额等信息。要创建一个按照产品名称、销售日期和销售额进行汇总的数据透视表,可以使用以下SQL语句: ``` SELECT ProductName, SaleDate, SUM(SaleQuantity) AS TotalQuantity, SUM(SaleAmount) AS TotalAmount FROM Sales GROUP BY ProductName, SaleDate; ``` 该语句将Sales表按照ProductName和SaleDat
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。