小编Rit*_*ato的帖子

在未排序的数组中,将第一个较大的元素替换为右边的每个元素

在未排序的数组中,我们必须用右边的第一个元素替换每个元素,该元素大于当前元素.如果右边的元素都不大,那么它应该替换为-1.

例:

3  1  2  5  9  4  8   should be converted to
5  2  5  9 -1  8 -1
Run Code Online (Sandbox Code Playgroud)

我可以想到一个简单的解决方案,我们用整个阵列检查每个元素,这是一个Ο(n²)解决方案.有一个更好的方法吗?

arrays algorithm time-complexity data-structures

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

重新排列一个数组,使arr [i]成为带有O(1)额外空间的arr [arr [i]]

任务是使重排的阵列arr[i]变得arr[arr[i]]O(1)额外的空间.

例:

2 1 3 5 4 0 
Run Code Online (Sandbox Code Playgroud)

变为:

3 1 5 0 4 2
Run Code Online (Sandbox Code Playgroud)

我能想到一个O(n²)解决方案.这里O(n)提出一个解决方案:

  1. 增加每个数组元素arr[i]通过(arr[arr[i]] % n)*n.
  2. 将每个元素除以n.

但这非常有限,因为它会导致缓冲区溢出.

有人能想出一个改进吗?

language-agnostic arrays algorithm

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

使用位移找到整数平方根的最快方法是什么?

我一直在寻找计算数字(整数)的平方根(整数)的最快方法.我在维基百科中遇到了这个解决方案,它找到了一个数字的平方根(如果它是一个完美的正方形)或者它最近的下方完美正方形的平方根(如果给定的数字不是一个完美的正方形:

short isqrt(short num) {
    short res = 0;
    short bit = 1 << 14; // The second-to-top bit is set: 1L<<30 for long
    // "bit" starts at the highest power of four <= the argument.
    while (bit > num)
        bit >>= 2;
    while (bit != 0) {
        if (num >= res + bit) {
            num -= res + bit;
            res = (res >> 1) + bit;
        }
        else
            res >>= 1;
        bit >>= 2;
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

我尝试了很多测试运行来跟踪算法,但我似乎并不理解里面的部分 …

bit-shift square-root memory-efficient

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

鉴于x,y,如何找到x!可以被y整除吗?

计算x!可能非常昂贵,可能经常导致溢出.有没有办法找出是否x!如果没有计算x,你可以被y整除!

  • 对于y <x,它是微不足道的;
  • 但是,对于y> x,例如x = 5且y = 60; 我正在努力寻找一种不用计算x的方法!

algorithm performance

4
推荐指数
2
解决办法
595
查看次数

&lt;Spring Batch&gt; 为什么使 ItemReader 线程安全会导致我们失去可重启性?

我有一个从数据库读取的多线程批处理作业,我担心不同的线程重新读取记录,因为 ItemReader 在 Spring 批处理中不是线程安全的。我浏览了SpringBatch 常见问题部分,其中指出

您可以同步 read() 方法(例如,通过将其包装在执行同步的委托程序中)。请记住,您将失去可重启性,因此最佳做法是将步骤标记为不可重启,并且为了安全(和高效),您还可以在阅读器上设置 saveState=false。

我想知道为什么在这种情况下我会失去重新启动性?可重启性与同步我的读取操作有什么关系?它总是可以再试一次,对吧?另外,这段代码是否足以同步阅读器?

  public SynchronizedItemReader<T> implements ItemReader<T> {
  private final ItemReader<T> delegate; 
  public SynchronizedItemReader(ItemReader<T> delegate) {
    this.delegate = delegate;
  }
  public synchronized T read () {
    return delegate.read();
  }
}
Run Code Online (Sandbox Code Playgroud)

multithreading spring-batch

3
推荐指数
1
解决办法
5872
查看次数

如何找到一个很长字符串的所有唯一子字符串?

我有一个很长的字符串。我想找到这个字符串的所有唯一子字符串。我尝试编写代码,其中使用集合(python)来存储所有子字符串以确保唯一性。对于许多中型和大型字符串,我得到了正确的结果,但是在非常大的字符串的情况下,我得到了 MemoryError。我用谷歌搜索了一下,发现python中的set数据结构有很大的 RAM 占用空间,也许这就是我收到 MemoryError 的原因。

这是我的代码:

a = set()
for i in range(n):
    string = raw_input()
    j = 1
    while True:
        for i in xrange(len(string)-j+1):   
            a.add(string[i:i+j])
        if j==len(string):   break
        j+=1
print sorted(list(a))
Run Code Online (Sandbox Code Playgroud)

有没有办法避免大字符串的这个错误?或者有人可以建议对我的代码进行更好的修改来处理这个问题吗?

PS:我没有在 32 位和 64 位版本之间转换的选项。

python memory string algorithm large-data

2
推荐指数
1
解决办法
4954
查看次数