- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
首先,我知道这里有一个类似的问题:
Radix Sort for Negative Integers
然而,它与此不重复。
我正在研究基数排序,有一个关于Sedgewick教授和Wayne教授实现LSD基数排序的问题。
public static void sort(int[] a) {
final int BITS = 32; // each int is 32 bits
final int R = 1 << BITS_PER_BYTE; // each bytes is between 0 and 255
final int MASK = R - 1; // 0xFF
final int w = BITS / BITS_PER_BYTE; // each int is 4 bytes
int n = a.length;
int[] aux = new int[n];
for (int d = 0; d < w; d++) {
// compute frequency counts
int[] count = new int[R+1];
for (int i = 0; i < n; i++) {
int c = (a[i] >> BITS_PER_BYTE*d) & MASK;
count[c + 1]++;
}
// compute cumulates
for (int r = 0; r < R; r++)
count[r+1] += count[r];
// for most significant byte, 0x80-0xFF comes before 0x00-0x7F
if (d == w-1) {
int shift1 = count[R] - count[R/2];
int shift2 = count[R/2];
for (int r = 0; r < R/2; r++)
count[r] += shift1;
for (int r = R/2; r < R; r++)
count[r] -= shift2;
}
// move data
for (int i = 0; i < n; i++) {
int c = (a[i] >> BITS_PER_BYTE*d) & MASK;
aux[count[c]++] = a[i];
}
// copy back
for (int i = 0; i < n; i++)
a[i] = aux[i];
}
if (d == w-1) {
int totalNegatives= count[R] - count[R/2];
int totalPositives= count[R/2];
for (int r = 0; r < R/2; r++)
// all positive number must come after any negative number
count[r] += totalNegatives;
for (int r = R/2; r < R; r++)
// all negative numbers must come before any positive number
count[r] -= totalPositives;
}
最佳答案
基本算法
让我们从忽略最重要的块开始,并尝试理解代码的其余部分。
这些算法逐字节处理整数。每个字节可以有256个不同的值,这些值是单独计算的。这就是第一个街区发生的事。之后
int[] count = new int[R+1];
for (int i = 0; i < n; i++) {
int c = (a[i] >> BITS_PER_BYTE*d) & MASK;
count[c + 1]++;
}
count[i]
是
a
中在其第
i-1
字节中具有值
d
的元素的数目(注意,它们使用
count[c + 1]++
,所以
count[0] == 0
)
for (int r = 0; r < R; r++)
count[r+1] += count[r];
count[i]
是该bucket的第一个元素应该在(中间)输出中结束的索引(注意
count
的长度为257(
R + 1
),因此可以忽略累积数组的最后一个元素我将把它放在下面的示例中的方括号中。)让我们看一个有4个值的示例(而不是256,以保持简洁):
[0, 3, 3, 2, 1, 2]
的数组。这将给出计数
[0, 1, 1, 2, 2]
和累计计数
[0, 1, 2, 4, (6)]
。这些正是排序数组中第一个
0
、
1
、
2
和
3
的索引(这将是
[0, 1, 2, 2, 3, 3]
)。
for (int i = 0; i < n; i++) {
int c = (a[i] >> BITS_PER_BYTE*d) & MASK;
aux[count[c]++] = a[i];
}
for (int i = 0; i < n; i++)
a[i] = aux[i];
count
对于最后一步是不正确的。最有效位为0(正数)的值的计数位于数组的前半部分,最有效位为1(负数)的值的计数位于数组的后半部分因此,数组的上半部分和下半部分必须“翻转”。
counts
数组的长度为257,因此前128个元素(257/2)是前半部分,其余129个元素是后半部分。
-2
、
-1
、
0
和
1
。它们的二进制表示是
10
,
11
,
00
,
01
,因此分别映射到
2
,
3
,
0
,
1
的无符号数。
a
视为
[0, -1, -1, -2, 1, -2]
转换为无符号:
[0, 3, 3, 2, 1, 2]
。应用该算法获得累积计数:
[0, 1, 2, 4, (6)]
。如果我们不进行翻转,我们最终将得到排序的无符号数组
[0, 1, 2, 2, 3, 3]
,这相当于有符号数组
[0, 1, -2, -2, -1, -1]
。分类不正确。
counts
数组分成两部分:
[0, 1]
和
[2, 4, (6)]
前半部分有2个(2-0)元素,后半部分有4个(6-2)元素。因此,我们在前半部分的每个元素上加4:
[4, 5]
,在后半部分的每个元素上减去2:
[0, 2, (4)]
将两部分组合在一起会得到
[4, 5, 0, 2, (4)]
。
[2, 2, 3, 3, 0, 1]
(第一个0位于索引4,第一个1位于索引5,依此类推)。将此值转换回有符号值将得到
[-2, -2, -1, -1, 0, 1]
,这确实是正确的。
counts
数组用于两个不同的目的首先它用于计算单独的事件,然后它用于计算累积的事件单独计数时,不使用数组的第一个元素累积计数时,不使用数组的最后一个元素。
关于java - LSD基数排序为负整数,无队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51721874/
我有一个非常基本的 MySQL 查询,它从数据库表中读取行并将行值添加或减去定义为 $total_balance 的 PHP 字符串。 例如; $statement_details_query = m
我有 following fiddle ,请注意,如果您使输出的宽度变小,图像将被覆盖并且不会出现滚动条 - 完美。 如果我attempt the same effect on the right ,
这个正则表达式将得到 456。我的问题是为什么它不能是 1-234-56 中的 234 ? 56 是否限定 (?!\d)) 模式,因为它不是单个数字。 (?!\d)) 寻找的起始点在哪里? impor
我需要知道两个子结构之间的内存距离 (&my_type.a - &my_tape.b.c) 结果的类型是什么?我需要将它转换为 (signed int),所以显然它是别的东西。 最佳答案 根据 C11
我遇到了一个扩展异常的异常处理程序类,如下所示: public class AppFileReaderException extends Exception { //Explicit seri
如何可视化负 RGB 值? 根据 OpenCV 文档: CV_8S - 8 位有符号整数 (-128..127) 这是否意味着 -128 表示 0 而 127 表示 255? 如果是,那我们为什么需要
我这里有一段代码给我带来了麻烦: idIndex = panoBuffer.indexOf("\"photo_id\":"); System.out.println(idIndex);
我刚刚练习 Java,对此还很陌生。我只是想创建一个随机数生成器程序来跟踪玩家的获胜、失败、获胜百分比和总获胜金额。该程序的逻辑是,玩家每次 session 有 3 次机会,计算机会生成一个随机数,玩
因此,我们被要求创建一个程序,使用户能够从 1-6 个有关矩阵运算的选项中进行选择。在每个用户的输入中,我们需要检查该输入是否适合要完成的操作(程序应该接受整数或 float ,正数或负数)。如果不满
这是我期望的输出 x |x| 1.2 1.2 -2.3 2.3 3.4 3.4 但我一直收到这个: x |x| 1
假设我有这个: $date1=date_create(date('H:I', strtotime('8:00'))); $date2=date_create(date('H:I', strtotime
如何确定负 FixNum 的无符号解释? # unexpected, true (~0b01111011).to_s(2) == ("-" + (~0b01111011).abs.to_s(2)) #
这是一个用于“邀请您的 friend 加入此群组”脚本的快速 SQL 查询。 我有 2 个表:users 和 group_members。我正在尝试执行一个查询,选择我所有的 friend ——由第一
负 ASCII 值有什么意义? int a = '«'; //a = -85 but as in ASCII table '<<' should be 174 最佳答案 没有负数ASCII值。 ASC
我知道用 PHP 可以做到这一点,但是有没有办法只用 MySQL 来做到这一点? 我有这个数据库: --------------------------------------------------
我在变量中有一个时间戳 $data = (float) -2208988800; 是否可以根据这些数据创建正确的日期?date("d.M.Y", $data) 返回“07.02.2036” 最佳答案
你好我如何将括号格式的负值转换为 double 值。目前我有这个。 Payment.Text = Calc_Payment().ToString("#,##0.00;(#,##0.00)"); 将支付
这是一个小程序。这应该打印 0 或 1,还是它有未定义的行为? #include struct S0 { unsigned f1 : 1; }; struct S0 s; int main (v
运行 lgb.cv 时,我有时会从日志中看到“从分数开始训练”后的负数。想知道这个数字到底是什么意思,单位是什么?是根据参数中指定的指标吗?以下是摘录: [LightGBM] [Info] Total
我正在使用变分自动编码器类型模型,我的损失函数的一部分是均值为 0 和方差为 1 的正态分布与另一个均值和方差由我的模型预测的正态分布之间的 KL 散度。 我用以下方式定义了损失: def kl_lo
我是一名优秀的程序员,十分优秀!