当前位置: 首页 > news >正文

39.离散化与哈希

一、离散化

1.简介

离散化是一种数据处理的技巧,可以通过降低数据规模来降低算法的复杂度和实现难度,其保证数据在哈希以后仍然保持原来的全/偏序关系。

通俗地讲就是当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照排名来处理问题,即离散化。下面是一个简单的例子:

原数据199999950505234396101
离散化165243

几乎所有的数据类型都可以使用离散化,只要它本身存在全/偏序关系即可,例如:大整数、浮点数、字符串等等。离散化通常都会和其他算法结合使用,作为一种前置的数据处理方式,因此它的应用面非常广泛。

2.离散化方法

离散化的实现方式很灵活,只要能够维持原本的关系即可,而且离散化的方式也需要根据题目的要求来变化。我们给出一个常用的离散化方法:

  • 对原数据进行排序,然后去除排序后数组中的重复元素。这里可以使用 STL 提供的一个方法 unique 去重,使用它需要头文件 #include <algorithm>。使用 unique 之前必须先排序,否则会产生意料之外的错误。
  • 调用 unique 后会返回去重后的分界线的地址指针,减去数组起始地址后我们就得到了元素去重以后的元素个数了。
  • 最后将原数组与排序去重后的数组进行一一对应即可。我们对原数组中的每个数都用二分查找的方式在排序去重后的新数组中找到其现在的下标,这个下标就是其对应的离散化结果。
  • 离散化的时间复杂度是 O(nlog⁡n)O(n\log n)O(nlogn)
  • 模板代码如下所示:
for(ll i = 1; i <= n; i++)tmp[i] = arr[i];
sort(tmp + 1, tmp + n + 1);
ll len = unique(tmp + 1, tmp + n + 1) - (tmp + 1);
for(ll i = 1; i <= n; i++)arr[i] = lower_bound(tmp + 1, tmp + len + 1, arr[i]) - tmp;

二、字符串哈希

三、作业

1.离散化

P1496 火烧赤壁

P1884 [USACO12FEB] Overplanting S

P1955 [NOI2015] 程序自动分析

2.字符串哈希

P3370 【模板】字符串哈希

P7469 [NOI Online 2021 提高组] 积木小赛

http://www.dtcms.com/a/335286.html

相关文章:

  • 数据结构:二叉树的遍历 (Binary Tree Traversals)
  • 杂记 03
  • v-scale-scree: 根据屏幕尺寸缩放内容
  • 基于Python的电影评论数据分析系统 Python+Django+Vue.js
  • 防御保护12-14
  • tmux常用命令
  • Flamingo
  • KingbaseES主备读写分离集群安装教程
  • 字节数据流
  • 北汽新能源半年报:双品牌战略拉动销量增长,多元布局促进转化
  • PIDGen!DecodeProdKey函数分析之四个断点
  • 【大模型应用开发 3.RAG技术应用与Faiss向量数据库】
  • 【leetcode】12. 整数转罗马数字
  • 关于“双指针法“的总结
  • 【Python】Python爬虫学习路线
  • “openfeign“调用接口上传文件报错:Failed to deleted temporary file used for part [file]
  • c++11扩展(c++11并发库)
  • 在职老D渗透日记day18:sqli-labs靶场通关(第26关)get报错注入 过滤or和and基础上又过滤了空格和注释符 ‘闭合 手动注入
  • echarts 画一个饼图,并且外围有一个旋转动画
  • linux下程序运行一段时间无端崩溃/被杀死,或者内存占用一直增大。linux的坑
  • 11.web api 2
  • 模式匹配自动机全面理论分析
  • AI短视频爆火?记录AIGC在影视制作场景的实践教程
  • 大模拟 Major
  • 随机整数列表处理:偶数索引降序排序
  • jd-hotkey探测热点key
  • 流量分析服务一审构成非法经营罪二审改判:数据服务的法律边界
  • 电路方案分析(二十二)适用于音频应用的25-50W反激电源方案
  • ethernet_input到应用层处理简单分析
  • 5 索引的操作