首页 > 其他分享 >区间半群查询与 Ackermann 函数

区间半群查询与 Ackermann 函数

时间:2023-08-12 21:33:55浏览次数:34  
标签:Ackermann log 3p 合并 查询 区间 半群 预处理 2k

最近在思考半在线卷积的复杂度有没有可能进一步优化, 决定先理清类似的问题以寻求经验.

一区间合并

如果询问的时候不能进行半群运算, 显然我们需要在预处理阶段处理所有答案, 必须进行 \(O(n^2)\) 次计算.

二区间合并

如果询问的时候可以进行一次半群运算, 则可以把序列每次在中点处折开, 处理中点到两边的信息, 然后剩下的递归下去.

这样预处理的时间是 \(O(n\log n)\), 询问只需要 \(1\) 次询问.

四区间合并

先把序列分成 \(n/\log n\) 个大小为 \(\log n\) 的块, 消耗 \(O(n)\) 的时间处理出每个块前缀和后缀的信息.

询问的时候, 如果端点在同一个块里, 则直接考虑子问题里的情况. 否则取两端块的前后缀信息, 拼上一个对块预处理的二区间结构. 这是个四区间合并.

由于我们现在是对一个 \(n/\log n\) 大小的数组做二区间合并的信息预处理, 时间是 \(O(n)\) 的, 然后要对每个小块递归下去, 所以时间复杂度是 \(T(n) = O(n) + (n/\log n) T(\log n)\). 也就是 \(n\) 乘以这个递归的深度, 即 \(O(n\log^* n)\).

查询只需要 \(3\) 次运算.

\(2k\) 区间合并

我们已经积累了足够的经验, 可以考虑攻克一般的 \(2k\) 了.

我们考虑定义 \(n = T(m, k)\) 是这样一个函数: \(n\) 是递归确定的数, 满足: 查询是 \(2k\) 区间合并的时候, 长度 \(\leq n\) 的数列可以只用 \(mn\) 次运算.

对于二区间合并而言, 分治一个 \(2^\ell\) 的数组, 在顶层需要消耗 \(2^\ell - 2\) 次运算. 总共的运算次数就是 \((\ell-2)2^\ell + 2 \leq (\ell - 1)2^\ell\), 我们可以取 \(n = 2^{m+1}\). 于是令

\[T(m, 1) = 2^{m+1}. \]

接下来考虑 \(2k\) 区间合并. 回忆我们的策略是把序列切成很多个块, 块形成的数列用 \(2(k-1)\) 区间合并的数据结构来做. 设 \(n = n'L'\), 其中 \(n'\) 是块形成的数列长度, 我们接受 \(L'\) 时间的预处理, 所以 \(n' = T(L', k-1)\). 但还需要前后缀的维护, 现在扫一层的时间是 \(3n\). 所以令 \(L' = T(m-3, k)\).

现在我们重新理一遍思路:

对于 \(n = n' L'\), 对于每个落在大小为 \(L'\) 的块, 我们给每个块分配 \((m-3)L'\) 的预处理时间, 所有块的预处理时间只和不超过 \((m-3)n\). 对于 \(n'\) 大小的块, 我们花了 \(2n'\) 时间预处理所有前后缀, 外加 \(n'L' = n\) 的时间预处理它的 \(2(k-1)\) 区间合并的结构.

于是我们有

\[T(m,k) = T(m-3,k)T(T(m-3,k),k-1). \]

最后补一下边界情况, 不妨直接让 \(T(0,k)=T(1,k)=T(2,k) = 2k\).

那么对于 \(n \leq T(m, k)\), 可以在 \(mn\) 次预处理的情况下支持每次查询 \(2k-1\) 次操作.

Ackermann 函数

不妨令 \(m = 3p\), 然后让 \(T\) 的输出缩小到 \(1/3\) 量级, 记为新的函数 \(S(p, k)\).

由于 \(T(3p, 1) = 2^{3p+1} \geq 2^{3p-1}\cdot 3\), 所以令 \(S(p, 1) = 2^{3p-1}\).

对于递归式, 由于 \(T(3p, k) \geq T(T(3p-3,k),k-1)\), 令 \(S(p,k) = S(S(p-1,k),k-1)\).

再对于 \(k\geq 2\), 令边界条件 \(S(0,k) = \lfloor 2k/3\rfloor\).

现在整理我们的定义:

\(S(p, 1) = 2^{3p-1}\).

\(S(0, k) = \lfloor 2k/3\rfloor\).

\(S(p,k) = S(S(p-1,k),k-1)\).

回顾 Ackermann 函数 \(A(m,n)\) 的定义:

\(A(0,n)=n+1\),

\(A(m+1,0) = A(m, 1)\),

\(A(m+1,n+1) = A(m, A(m+1,n))\).

只要证明存在 \(c\) 使得 \(S(cn,cn) > A(n,n)\), 就可以证明: \(n\) 次询问只需要 \(O(n\alpha(n))\) 次半群运算了.

(鸽)

标签:Ackermann,log,3p,合并,查询,区间,半群,预处理,2k
From: https://www.cnblogs.com/Elegia/p/range-semigroup-query.html

相关文章

  • 多表联查和单表多次查询的异同
    多表联查和单表多次查询各有优点,选择哪种方式更好取决于具体的情况和数据量大小。在数据量不大的情况下,多表联查和单表多次查询的效率差别不大,因此使用多表联查可能更方便。然而,当数据量足够大时,单表多次查询的效率更高,因为这种查询方式可以让缓存的效率更高,减少冗余记录的查询,并有......
  • linux中常用端口查询命令
    1、lsof-i:80 用于查看某一端口的占用情况2、netstat-tunlp|grep80 用于查看指定的端口号的进程情况......
  • 8.7-8.13学习总结博客五:Hive进阶与复杂查询
    博客题目:学习总结五:Hive进阶与复杂查询实践内容概要:学习Hive进阶的使用方法,包括复杂查询、数据转换和性能优化等方面的知识。学习资源:推荐的Hive进阶教程、实践案例和性能优化技巧。实践内容:通过编写复杂的Hive查询语句,探索Hive的高级功能和性能优化方法,并分享实践中的挑战和解决......
  • 在千万级的数据库查询中,如何提高效率?
    1.数据库设计方面a.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。b.应尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:selectidfromtwherenumisnull可以在num上设置默认值0,确保表中......
  • Openlayers构建指定发布图层的查询条件
    constfeatureRequest=newol.format.WFS().writeGetFeature({srsName:"EPSG:4326",//这里的EPSG不要改为4326,可能无法显示?featureNS:"http://geoserver.org/WS",//这里是工作空间中的命名空间urlfeature......
  • 谷歌云 | BigQuery 现在支持用于查询开放表格式的清单文件
    【本文由CloudAce整理发布。CloudAce是谷歌云全球战略合作伙伴,拥有300多名工程师,也是谷歌最高级别合作伙伴,多次获得GoogleCloud合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。】开放表格式依赖嵌入式元数据来提供事务一致的......
  • 导出接口,加@RequestBody对查询条件的影响
      在做导出接口时,对post方法的该传参中加了@RequestBody注解,会将查询条件的content-Type设置为application/json@PostMapping("/export")publicvoidovertimeExport(HttpServletResponseresponse,@RequestBodySysUsersysUser){List<SysUser>list=SysUserS......
  • 数据查询新助手——Supabase AI SQL Editor服务介绍
    在数据处理和数据库查询中,SQL语言是一种重要的工具,但对于不熟悉SQL语法的人来说,编写查询可能会是一项挑战。现在,有了SupabaseAISQLEditor服务,编写SQL查询将变得更加轻松。SupabaseAISQLEditor是一款革命性的人工智能SQL编辑器,通过直观的方式理解用户的查询意图,并为数据库提供......
  • 封装一个useTable 内置分页 条件变换查询
    import{Table}from'antd';import{useImmer}from'common/hooks/useImmer';import{get}from'utils/request';importtype{ColumnsType,TablePaginationConfig}from'antd/es/table';import{useState}from......
  • MySQL全文搜索的高级特性:查询扩展(Query Expansion)
    查询扩展(QueryExpansion)是全文搜索的一个高级特性,尤其对于某些搜索需求来说非常有用。它是基于原始查询返回的结果来进一步扩展并改进搜索结果的过程。当用户执行全文搜索查询时,可能会遇到以下情况:查询结果太少或没有。由于用户不熟悉正确的术语或关键字,查询不准确。在这些......