来自编程珍珠的示例

Posted

技术标签:

【中文标题】来自编程珍珠的示例【英文标题】:bsort example from programming pearls 【发布时间】:2011-12-08 05:23:39 【问题描述】:

在 Programming Pearls 中有一种算法可以对不同长度的数组进行排序,但排序的时间与它们的长度之和成正比。例如,如果我们有一个记录数组x[0...n-1],每条记录都有一个整数长度和一个指向数组bit[0...length-1]的指针。

代码是这样实现的:

void bsort(l, u, depth)
    if (l >= u)
        return ;
    for (i = l; i <= u; i++)
        if (x[i].length < depth)
            swap(i, l++);
    
    m = l;
    for (int i = l; i < u; i++)
        if (x[i].bit[depth] == 0)
            swap(i, m++);
    
    bsort(l, m - 1, depth + 1);
    bsort(m, u, depth + 1);

我的问题是,鉴于记录:

x[6] = "car", "bus", "snow", "earth", "dog", "mouse"

我知道如何获取字符串长度,但是位数组呢?我怎样才能制作一个适合这个字符串数组的位数组?甚至x[i].bit[depth] 我该如何实现呢?

【问题讨论】:

我试图清理这个,但你的问题仍然不是很清楚。基本上你正在考虑对char[] 进行排序并且你想知道是否可以对位数组进行排序?我认为这取决于您的位数组是如何实现的。 我想说的是,我也不清楚如何用字符串的记录实现位排序,看不懂 【参考方案1】:

字符数组(或任何其他类型,就此而言)也是位数组 - 毕竟,字符是由位组成的。所以你不必创建一个单独的数组,你只需要找到一种方法来访问数组中的给定位。为此,您必须使用一些位操作。您可以在这里找到一些如何做到这一点的示例:Any smarter way to extract from array of bits?。

基本上,您首先必须找出所需位所在的字节,然后获取该特定位的值。顺带一提:

char* array = "the array";
int required_bit = 13;
int bit = required_bit & 0x7;  // get the bit's offset in its byte
int byte = required_bit >> 3;  // get the bit's byte
int val = (array[byte] >> bit) & 0x1; // check if the bit is 1

现在将其包装在一个函数中(可能会进行额外的绑定检查,以确保给定的required_bit 不在数组之外),并与x[i] 一起使用。

【讨论】:

这是一个很好的答案@eran,只有一个问题假设我们有整数数组而不是字符串数组,然后 x[i].length 它是代表这个数字的位数是吗? x[i].bit[depth] 它是位置深度的位数是吗? 您不能使用x[i].length 来获取数组的长度,这不是Java... 对于字符串,您可以使用strlen。对于整数,您必须将大小与数组一起传递。此外,您没有 bit[depth] 部分 - 您在 x[i] 上工作。最后,如果您有一个 int 数组,则必须进行一些更改 - int 不是 1 个字节,因此 array[byte] 不会访问 byte 字节,而是 byte int。最简单的方法是将int* 转换为char* 对不起@eran,但我已经很困惑了,在我的示例中我的代码将如何编写?我在示例中显示了字符串数组,请告诉我我的代码看起来如何? 您应该首先创建一个int get_bit(char* array, int bitpos) 函数。然后,将其称为int bit_val = get_bit(x[i], depth)(假设depth 是您感兴趣的值)。这将为您提供x[i] 数组中的depth 位。 但是 x[i] 是字符数组而不是一个字符是吗?或者没关系

以上是关于来自编程珍珠的示例的主要内容,如果未能解决你的问题,请参考以下文章

代码在 Visual c++ 中无法按预期工作(来自 bjarne stroustrup 编程和原则书 2n 版的示例)

备份联系人示例代码或来自 iPhone 的示例

编程珍珠中的词频

“编程珍珠”:qsort 的冲突类型

“编程珍珠”:搜索

使用更多空间编程珍珠的恒定时间初始化 - 第 1 列