- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想给我的用户一个简洁的 base-64 字母数字代码,以代表他们在从 1024 名候选人的选票中按顺序选择 1024 名候选人时所做的选择。 (这是最坏的情况......我可能可以忍受 < 256)。
我有哪些选择?
一种天真的方法告诉我,如果 1024 个元素中的每一个都可以用唯一的序数 (2 ^ 10) 表示,并且我需要一系列 1024 个序数,那么 10 位 x 1024 个位置 = 10,240 位就可以了。但这仍然是 1707 基 64 位,比我希望的要长一点,感觉就像我在浪费 9 位来表示“1”(尽管我可能错了)。
经典置换理论应该告诉我可能性的数量 - nPr(顺序很重要,没有重复)。但是这个数字太大了,它困扰着我的小脑袋,压倒了我的 dec<->bin 计算器。如果我这样做,我会得到更少的位吗? (为什么不呢?数学很烂,嗯?)
Java 代码的加分点,因此我可以修改 n 和 r 以找到所需的位数以及基数 64 位数。 :-)
附注。这是对我关于使用纸张进行审计跟踪和使用计算机进行快速计数的投票系统的严肃提案的可行性测试。
最佳答案
Wolfram alpha will tell you在最佳表示中,您需要 ⌈log2(1024!)⌉=8,770 位。并不比天真地存储元素本身好多少。实现这种稍微简洁的表示的概念上最简单的方法是想象所有这些按字典顺序排列的排列。然后您可以简单地将排列的索引存储在该列表中。为了实现这一点,您可以迭代排列的元素,并在每个位置问自己有多少排列具有所有前面的位置共同,但在当前位置的值较小。将这些数字相加将导致排列的从零开始的索引。
由于您为此询问了 Java 代码,因此这里有一段代码将确定所需的位数,并且还将计算给定排列的简明表示。
import java.math.BigInteger;
class SO18757672 {
int n;
BigInteger[] fac;
SO18757672(int n) {
this.n = n;
fac = new BigInteger[n + 1];
fac[0] = BigInteger.ONE;
for (int i = 1; i <= n; ++i)
fac[i] = fac[i - 1].multiply(BigInteger.valueOf(i));
}
int bitsRequired() {
return fac[n].subtract(BigInteger.ONE).bitLength();
}
BigInteger codeFor(int[] permutation) {
if (permutation.length != n)
throw new IllegalArgumentException("wrong length");
BigInteger res = BigInteger.ZERO;
for (int i = 0; i != n; ++i) {
int pi = permutation[i];
if (pi < 0 || pi > n - i)
throw new IllegalArgumentException("invalid value");
res = res.add(fac[n - 1 - i].multiply(BigInteger.valueOf(pi)));
for (int j = i + 1; j != n; ++j) {
if (permutation[j] == pi)
throw new IllegalArgumentException("duplicate value");
if (permutation[j] > pi)
--permutation[j]; // We modify out input!
}
}
return res;
}
boolean sanityChecks() {
int[] p = new int[n];
// smallest code is zero, for all elements in order
for (int i = 0; i != n; ++i)
p[i] = i;
assert BigInteger.ZERO.equals(codeFor(p));
// largest code is n!-1, for all elements in reverse order
for (int i = 0; i != n; ++i)
p[i] = n - 1 - i;
assert fac[n].subtract(BigInteger.ONE).equals(codeFor(p));
return true; // so we can use this in an assert call
}
public static void main(String[] args) {
SO18757672 instance = new SO18757672(1024);
System.out.println(instance.bitsRequired() + " bits required");
assert instance.sanityChecks();
}
}
关于math - 我可以多么简洁地表示 1024 从 1024 的排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18757672/
这个问题在这里已经有了答案: Converting result of Math.sin(x) into a result for degrees in java (4 个答案) 关闭 5 年前。
我在学习 Kotlin 并在数学课上遇到了这个问题: java.lang.Math 和 kotlin.math 不兼容。这对我来说有点尴尬和困惑,因为 Kotlin 声称它与 Java 100% 兼容
我在其他问题中读到,例如由于浮点表示,sin(2π) 不为零,但非常接近。这个非常小的错误在我的代码中不是问题,因为例如我可以四舍五入 5 位小数。 但是当2π乘以一个非常大的数时,误差就会放大很多。
我正在用 C# 编写一个计算器。 textBoxResult 是我显示数字的文本框 recount 是一个以度为单位的角度并以弧度为单位返回的函数 我从 texBoxInput 获取角度 public
首先,让我们从我的数学背景开始。我已经学习了微积分 I - IV 和微分方程。我参加了第一学期的计算机图形类(class),在该类(class)中我们实现了几乎我们自己的图形管道,包括使用 Phong
早上好! 我只是想磨练我的数学能力,我特别有一些关于 Cocos2D 的问题。由于 Cocos2D 想要“简化”事物,所有 Sprite 都有一个旋转属性,范围从 0-360(359?)CW。这迫使你
是否有人对Intel Math Kernel Library和AMD Math Core Library都有编程经验?我正在建立一台用于高性能统计计算的个人计算机,并对正在购买的组件进行辩论。 AMD
函数的反函数是什么 math.atan2 我在 Lua 中使用它,我可以通过 math.tan 获得 math.atan 的逆。 但我在这里迷路了。 编辑 好的,让我向您提供更多详细信息。 我需要计算
我有一道等轴测投影的数学题。我读了一篇文章:Axonometric projections - a technical overview .对于等距投影部分,它给出了将 x 部分的 3D 点转换为 2
在 MySQL (5.1) 数据库表中,有数据表示: 用户执行任务需要多长时间 用户在任务中处理了多少项目。 MySQL 是否支持关联数据,还是我需要使用 PHP/C# 来计算? 我在哪里可以找到计算
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我正在尝试使用这两种方法在 C# 中解决这个问题: public double NormalPowerMethod(double x, double toPower) { return Mat
如何分配: var randomNumber = Math.random()*50 + Math.random()*20; 比较: var randomNumber = Math.random()*7
我正在查看我的代码,希望提高它的性能,然后我看到了这个: int sqrt = (int) Math.floor(Math.sqrt(n)); 哦,好的,我真的不需要调用 Math.floor,因为转
尝试调用 math.h 中的函数时, 我收到如下链接错误 undefined reference to sqrt 但我正在做一个 #include 我正在使用 gcc 并编译如下: gcc -Wall
祝大家有个愉快的一天,我有话要问你,为了更好地理解这里是我的代码: {math equation=((($order_total-$commission)+$discount+$delivery_ch
我尝试学习一些Clojure,因为该语言看起来不错。 但是似乎没有关于如何安装/使用库的信息,例如clojure.math.numeric-tower。 现在,我通过在Linux shell中键入以下
As Math.sign() 接受数字参数或数字作为字符串,如 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Gl
如何将scala.math.BigDecimal转换为java.math.BigDecimal? 最佳答案 无需在字符串之间进行双重转换。 val sb = scala.math.BigDecimal
为什么下面的 JavaScript 会这样 Math instanceof Math 抛出错误 TypeError: Expecting a function in instanceof check,
我是一名优秀的程序员,十分优秀!