【问题标题】:Save permutation with less bytes than permutation length使用少于排列长度的字节保存排列
【发布时间】:2019-11-04 15:28:12
【问题描述】:

我想将长度 N 的排列保存在小于 N 字节的范围内。长度N的排列有元素1,2,3,....,N

排列具有以下偏好:

补充阅读:Rank and unrank permutation with special properties

有没有办法结合这些偏好来最小化排名的可能排列?还是有更多的偏好可以用来描述排列的字节数少于长度?

我的想法是指定一个排列子集,然后对其进行排名,但我未能组合首选项以创建一个通过首选项定义的子集。

【问题讨论】:

  • 首先,您可以将其保存在 (n-1) 个字节中。您可以存储前 n-1 个元素。最后一个是隐含的
  • 问题描述有点模糊。可以通过为每个项目符号添加详细描述来改进它。举个例子也会有所帮助。
  • @AbhayAravinda 倒数第二个只有 2 种可能性,可以存储在 1 位等中,最终整个排列可以使用其在阶乘数系统中的索引进行编码。不过,它不使用特殊属性。
  • 什么是 DI 序列?什么是实力?
  • 更新描述

标签: arrays algorithm compression permutation ranking


【解决方案1】:

一般来说不会。

只有一个循环的长度为n的排列与长度为n-1的排列一一对应。

强度是介于两者之间的正整数,不能超过n^2

可能的位串数为2^(n-1)

根据信鸽原则,对于一些位串和一些强度,至少必须有(n-1)! / (2^(n-1) n^2) = n! / (2^(n-1) n^3)

Stirling's approximation我们可以看到

log2( n! / (2^(n-1) n^3) )
    = n log2(n) - n log2(e) + O(log2(n)) - (n-1) - 3 log2(n)
    = n log2(n) - n (log2(e) + 1) - O(log2(n))
    = n log2(n) + O(n)

这告诉我们,即使在您的条件下,所需的位数也会比线性增长更快。因此,对于足够大的 n,您将需要超过 n 字节的数据来指定单个排列。

【讨论】:

  • 好的,让我们将n 限制为:500
  • @TThoEinthausend 我敢打赌,5000 仍然不可能。最坏的情况应该是位串 101010...101 和强度大约为 1250 万。
  • 是的,但如果我有像...00000100000... 这样的位串,则定义的子集要小得多。通常我想描述的排列有一个子集,可以保存在最大n*0.98字节中,我想用额外的约束来降低这个因素。但是组合约束很难。
猜你喜欢
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2011-10-17
  • 2016-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多