![]() |
1
4
我想不出一种方法来随机地完成整个文件,而不必以某种方式维护已经写入的内容的列表。我想如果我必须做一个内存高效的洗牌,我会扫描文件,为新的行建立一个偏移列表。一旦我有了这个新行偏移列表,我将随机选择其中一个,将其写入stdout,然后将其从偏移列表中删除。 我不熟悉Perl或Python,但可以用PHP演示。
我能想到的另一个选择是,如果扫描文件中的新行是绝对不可接受的,那就是(我不会将这一行编码出来):
|
![]() |
2
3
下面的算法是 线性的 输入文件中的行数。 Preprocessing:
主要的
所以总的复杂性是线性的(因为
|
![]() |
3
0
您可以为n个字符串创建一个数组,并将文件的前n行读取到此数组中。对于其余的部分,您读取一行,随机选择数组中的一行,并将该字符串替换为新读取的字符串。此外,还可以将字符串从数组写入输出文件。这样做的好处是,您不需要对文件进行两次迭代。缺点是它不会创建一个非常随机的输出文件,特别是当n很低时(例如,该算法不能在输出中移动最后一行超过n行)。 编辑 在python中仅举一个例子:
|
![]() |
feasega · 聚合物模拟-2个节点之间的最短路线,适用于所有节点 7 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 7 月前 |
![]() |
b39b332d · 使用C++标准库实现高效间隔存储 11 月前 |
![]() |
Paul C · 在维基百科上,将二叉搜索树转换为排序链表的算法是否存在错误? 11 月前 |
![]() |
ABGR · 二叉树的直径——当最长路径不通过根时的失败案例 11 月前 |
![]() |
EpicAshman · 数独棋盘程序中同一列和同一行出现两次的数字 11 月前 |