小编Kai*_*Kai的帖子

rsync算法如何正确识别重复块?

我正在寻求了解rsync算法的工作原理.经过一番阅读和思考,我想出了一个我认为算法失败的情况.我试图找出在实际实现中如何解决这个问题.

考虑这个例子,其中A是接收者,B是发送者.

A = abcde1234512345fghij
B = abcde12345fghij
Run Code Online (Sandbox Code Playgroud)

如您所见,唯一的变化是12345已被删除.

现在,为了让这个例子变得有趣,让我们选择一个5字节的块大小(字符).使用弱校验和散列发送方的值会给出以下值列表.

abcde|12345|fghij

abcde -> 495
12345 -> 255
fghij -> 520

values = [495, 255, 520]
Run Code Online (Sandbox Code Playgroud)

接下来我们检查A中是否有任何哈希值不同.如果有匹配的块,我们可以跳到该块的末尾进行下一次检查.如果有一个不匹配的块,那么我们发现了一个区别.我会逐步完成这个过程.

  1. 哈希第一个块.这个哈希值是否存在于值列表中?abcde -> 495(是的,所以跳过)
  2. 哈希第二块.这个哈希值是否存在于值列表中? 12345 -> 255(是的,所以跳过)
  3. 哈希第三块.这个哈希值是否存在于值列表中? 12345 -> 255(是的,所以跳过)
  4. 哈希第四块.这个哈希值是否存在于值列表中? fghij -> 520(是的,所以跳过)
  5. 没有更多的数据,我们已经完成了.

由于在值列表中找到了每个哈希值,因此我们得出结论:A和B是相同的.在我看来,这不是真的.

在我看来,只要有多个块共享相同的哈希值,就会发生这种情况.我知道我已经跳过了计算和检查强散列的步骤,但这不会产生任何影响,因为第二个和第三个块完全相同

我错过了什么?

algorithm hash rsync

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

确定哪些输入在进化算法中权衡

我曾经写过一个很好玩俄罗斯方块的俄罗斯方块AI.我使用的算法(在本文中描述)是一个两步过程.

在第一步中,程序员决定跟踪对问题"感兴趣"的输入.在俄罗斯方块中,我们可能有兴趣跟踪连续存在的差距,因为最小化差距可以帮助更容易地放置未来的碎片.另一个可能是平均柱高,因为如果您即将失败,承担风险可能是个坏主意.

第二步是确定与每个输入相关联的权重.这是我使用遗传算法的部分.只要根据结果随时间调整权重,任何学习算法都会在此处执行.我们的想法是让计算机决定输入与解决方案的关系.

使用这些输入及其权重,我们可以确定采取任何行动的价值.例如,如果将直线形状一直放在右列中将消除4个不同行的间隙,那么如果其重量很高,则此动作可以获得非常高的分数.同样地,将其平放在顶部可能实际上会导致间隙,因此动作得分较低.

我一直想知道是否有办法将学习算法应用到第一步,在那里我们找到"有趣的"潜在输入.似乎可以编写一种算法,其中计算机首先学习哪些输入可能有用,然后应用学习来权衡这些输入.之前有过这样的事吗?它是否已经在任何AI应用程序中使用?

artificial-intelligence tetris evolutionary-algorithm

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

在Python列表推导中缓存值

我正在使用以下列表理解:

resources = [obj.get("file") for obj in iterator if obj.get("file") != None]
Run Code Online (Sandbox Code Playgroud)

有没有办法"缓存" obj.get("file")在if语句中检查它的值,以便它get在生成返回列表时不必再次调用obj?

python list-comprehension

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

参考Clojure传染媒介

创建不同引用向量的最简单方法是什么?

使用(repeat 5 (ref nil))将返回一个列表,但它们都将引用相同的ref:

user=> (repeat 5 (ref nil))
(#<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<R
ef@16ef71: nil>)
Run Code Online (Sandbox Code Playgroud)

结果相同(replicate 5 (ref nil)):

user=> (replicate 5 (ref nil))
(#<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil>
 #<Ref@1d88db7: nil>)
Run Code Online (Sandbox Code Playgroud)

vector clojure ref

5
推荐指数
1
解决办法
471
查看次数

当img高度小于窗口高度时,CSS或jQuery可缩放背景图像下方没有空白区域

我知道Oldie但是好东西.这个问题被问了很多次,但我没有得到明确的答案.可伸缩的背景图像,最好只有CSS,如果必须的话,愿意使用jQuery支持.我遇到的一个问题(即使用CSS3背景图像)是图像下方的空白空间,当它的高度小于浏览器窗口高度时.(例如:http://css-tricks.com/examples/ImageToBackgroundImage/)

这就是我想要完成的事情:

  • 保持纵横比
  • 如果浏览器窗口小于图像大小,则剪裁图像的高度和宽度
  • 图像以页面为中心,因此剪切不会偏移页面的流量

以下是一些说明这些目标的例子(尽管我认为可以做得更好):

谢谢你,谢谢你,谢谢你.

css jquery background image scalable

5
推荐指数
1
解决办法
7761
查看次数

递归释放C结构

我有一个结构,只包含我已分配的内存指针.有没有办法以递归方式释放每个指针而不是每个指针都是免费的?

例如,假设我有这样的布局:

typedef struct { ... } vertex;
typedef struct { ... } normal;
typedef struct { ... } texture_coord;

typedef struct
{
    vertex* vertices;
    normal* normals;
    texture_coord* uv_coords;
    int* quads;
    int* triangles;
} model;
Run Code Online (Sandbox Code Playgroud)

在我的代码中我malloc每个结构创建一个模型:

model* mdl = malloc (...);
mdl->vertices = malloc (...);
mdl->normals = malloc (...);
mdl->uv_coords = malloc (...);
mdl->quads = malloc (...);
mdl->triangles = malloc (...);
Run Code Online (Sandbox Code Playgroud)

可以直接释放每个指针,如下所示:

free (mdl->vertices);
free (mdl->normals);
free (mdl->uv_coords);
free (mdl->quads);
free (mdl->triangles);
free (mdl);
Run Code Online (Sandbox Code Playgroud)

有没有办法可以递归迭代mdl中的指针而不是在每个元素上调用free?

(实际上,为每一个编写free()几乎没有任何工作,但它会减少代码重复并且对于学习有用)

c malloc struct

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

为什么编译器假设malloc返回一个int?

我知道在C中,最好不要强制转换它的返回值malloc().我已经读过,malloc()如果不包含,编译器会假定返回一个int stdlib.h.当然,如果你试图隐式地将一个int分配给一个不是int的东西,那么它会产生一个错误,但是这个错误可能会被一个显式的强制转换所掩盖 - 因此有明确的强制转换的危险malloc().

对于我创建的任何函数,如果该函数不存在,那么编译器会告诉我.为什么编译器假设malloc()即使你没有包含它也会返回int stdlib.hmalloc()在包括之前,不应该保持未定义stdlib.h吗?

c malloc return

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

在OpenGL中平滑面边缘的技巧

当我使用面法线在OpenGL中点亮我的人体模型时,每个面都在模型上的位置非常明显.使用顶点法线,照明变得相当平滑但仍然明显.是否有任何技术可用于平滑有机模型而无需添加额外的顶点(例如细分)?

opengl lighting smoothing

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

python或bash - 在行尾添加"行和"

我有类似的文本文件

first line
line nr 2
line three
Run Code Online (Sandbox Code Playgroud)

等等

我想生成

"first line",
"line nr 2",
"line three",
Run Code Online (Sandbox Code Playgroud)

我想知道如何在python中执行此操作,或者如果它更容易/更快,可能在bash中执行此操作.我知道打开文件有不同的代码,在python(?)中只读取一行不同但我不确定在这种情况下使用哪个选项,更重要的是,如何添加这些字符.任何建议都会有帮助.

python linux bash

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

改变圆周运动的速度

我正在寻找一种平稳增加或减少圆周运动速度的方法.

使用圆的参数方程,我可以随时间移动圆中的对象:

x = center_x + radius * sin(time * speed)
y = center_y + radius * cos(time * speed)
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于我不能简单speed = speed + 1地加速对象,因为它会导致不稳定的运动.这是有道理的,因为基于绝对值而不是相对于对象的先前位置,每帧重新计算x和y值.

另一种方法可能是使用表示对象速度的向量,然后对向量应用圆周运动:

v_x = radius * sin(time * speed)
v_y = radius * cos(time * speed)
x = x + v_x
y = y + v_y
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,如果我改变速度,那么半径将增大或缩小.这是有道理的,因为运动是相对于当前位置的,所以如果我改变速度,基本上会跳过时间.

我能想到的一个可能有用的实现是使用从对象指向圆心的向量.然后我可以通过使用垂直向量计算对象位置处圆的切线,对其进行归一化并按速度进行缩放.我还没有实现这个,因为对于像这样的问题似乎有些过分,所以如果存在更简单的解决方案,请告诉我.谢谢!

simulation performance geometry physics

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