标签: programming-pearls

用于M位置的圆移N大小数组的最快算法

M位置的圆移位阵列的最快算法是什么?
例如,[3 4 5 2 3 1 4]班次M = 2个位置应该是[1 4 3 4 5 2 3].

非常感谢.

arrays puzzle algorithm math programming-pearls

32
推荐指数
4
解决办法
3万
查看次数

"编程珍珠"二进制搜索帮助

我似乎无法理解这是如何工作的.

问题:
给定一个顺序文件,其中包含最多40个随机顺序的32位整数,找到一个不在文件中的32位整数(并且必须至少有一个缺失)

答:
根据代表每个整数的32位来查看这个二进制搜索是有帮助的.在算法的第一遍中,我们读取(最多)40亿个输入整数,并将具有前导零位的那些写入一个顺序文件,将那些具有前导一位的那些写入另一个文件.

其中一个文件最多包含20亿个整数,因此我们接下来将该文件用作当前输入并重复探测过程,但这次是在第二位.

所以通过一遍又一遍地分割文件(二进制搜索),这实际上会导致我丢失32位整数?

algorithm programming-pearls

13
推荐指数
1
解决办法
1906
查看次数

帮我理解这个"编程珍珠"bitort程序

Jon Bentley在其编程珍珠的第1栏中介绍了一种使用位向量对非零正整数序列进行排序的技术.

我从这里获取了programort.c程序并粘贴在下面:

/* Copyright (C) 1999 Lucent Technologies */
/* From 'Programming Pearls' by Jon Bentley */

/* bitsort.c -- bitmap sort from Column 1
 *   Sort distinct integers in the range [0..N-1]
 */

#include <stdio.h>

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000

int a[1 + N/BITSPERWORD];

void set(int i) 
{
    int sh = i>>SHIFT;
    a[i>>SHIFT] |=  (1<<(i & MASK)); 
}
void clr(int i) { a[i>>SHIFT] &= ~(1<<(i & MASK)); }
int …
Run Code Online (Sandbox Code Playgroud)

c 32-bit programming-pearls

11
推荐指数
1
解决办法
3396
查看次数

找到Python最长重复字符串的有效方法(From Programming Pearls)

摘自编程珍珠第15.2节

可在此处查看C代码:http://www.cs.bell-labs.com/cm/cs/pearls/longdup.c

当我使用suffix-array在Python中实现它时:

example = open("iliad10.txt").read()
def comlen(p, q):
    i = 0
    for x in zip(p, q):
        if x[0] == x[1]:
            i += 1
        else:
            break
    return i

suffix_list = []
example_len = len(example)
idx = list(range(example_len))
idx.sort(cmp = lambda a, b: cmp(example[a:], example[b:]))  #VERY VERY SLOW

max_len = -1
for i in range(example_len - 1):
    this_len = comlen(example[idx[i]:], example[idx[i+1]:])
    print this_len
    if this_len > max_len:
        max_len = this_len
        maxi = i
Run Code Online (Sandbox Code Playgroud)

我发现这idx.sort一步很慢.我认为它很慢,因为Python需要通过值而不是指针传递子串(如上面的C代码).

测试文件可以从这里 …

c python suffix-tree suffix-array programming-pearls

11
推荐指数
3
解决办法
4811
查看次数

如何在O(nlogn)中找到总和最接近零或某个值t的子数组

实际上这是编程珍珠第2版第8章的问题#10.它提出了两个问题:给定一个整数数组A [](正数和非正数),你怎么能找到一个A []的连续子数组,其总和最接近0?或者最接近某个值t?

我可以想办法解决最接近0的问题.计算前缀和数组S [],其中S [i] = A [0] + A [1] + ... + A [i].然后根据元素值和保留的原始索引信息对此S进行排序,以找到最接近0的子阵列和,只需迭代S数组并执行两个相邻值的差异并更新最小绝对差值.

问题是,解决第二个问题的最佳方法是什么?最接近某个值t?任何人都可以提供代码或至少一个算法吗?(如果有人有最接近零问题的解决方案,也欢迎回答)

algorithm programming-pearls

11
推荐指数
2
解决办法
9990
查看次数

模数运算符为什么慢?

从"编程珍珠"一书中解释(关于旧机器上的c语言,因为本书是从90年代后期开始的):

整数算术运算(+,-,*),而可能需要大约10纳秒%操作员最多需要100毫微秒.

  • 为什么会有这么大的差异?
  • 模数运算符如何在内部工作?
  • /在时间方面它与division()相同吗?

modulo integer-division cpu-speed programming-pearls

9
推荐指数
1
解决办法
8940
查看次数

编程珍珠:找到一个整数至少出现两次

它在2.6节和问题2中,原始问题是这样的:

"鉴于包含4,300,000,000个32位整数的顺序文件,你怎么能找到至少出现两次的整数?"

我对这个练习的问题是:上述问题的技巧是什么?这个问题在于什么样的通用算法类别?

algorithm programming-pearls

8
推荐指数
2
解决办法
6168
查看次数

以下程序中的位掩码用法来自Programming Pearls

我今天开始阅读"Programming Pearls",在进行练习时,我遇到了这个问题"你将如何实现自己的位向量?".当我查看解决方案时,它是这样的:

#define BITSPERWORD 32
#define SHIFT 5
#define MASK 0x1F
#define N 10000000

int a[1 + N/BITSPERWORD]; 

void set(int i) { a[i >> SHIFT] |= (1 << (i & MASK)); 
Run Code Online (Sandbox Code Playgroud)

这个陈述让我感到困惑

 1 << (i & MASK)
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里发生了什么吗?

c mask bit programming-pearls

7
推荐指数
1
解决办法
940
查看次数

在包含最多40亿个整数的未排序数组中找到缺失的32位整数

这是描述的问题Programming pearls.我无法理解作者所描述的二进制搜索方法.任何人都可以帮忙详细说明吗?谢谢.

编辑:我一般可以理解二进制搜索.我只是无法理解如何在这种特殊情况下应用二进制搜索.如何确定缺失的数字是否在某个范围内,以便我们可以选择另一个.英语不是我的母语,这是我无法理解作者的一个原因.所以,请使用普通英语:)

编辑:谢谢大家的好评和评论!我从解决这个问题中学到的最重要的一课就是二元搜索不仅适用于排序数组!

algorithm binary-search programming-pearls

6
推荐指数
1
解决办法
4945
查看次数

最长的非重叠子串

我想知道是否有人知道最长重复非重叠子串的(最佳?)算法.

例如,在字符串中

ABADZEDGBADEZ

最长的反复出现是"不好".顺便提一下,如果没有这样的结果,算法应该警告这样的事情已经发生.我猜这是涉及后缀树.

我敢肯定这已经存在了.谢谢您的帮助!

string algorithm substring programming-pearls

5
推荐指数
2
解决办法
2742
查看次数