我熟悉从文件读取单个随机行而不将整个文件读入内存的算法.我想知道这种技术是否可以扩展到N个随机线?
用例是一个密码生成器,它连接从字典文件中拉出的N个随机字,每行一个字(如/usr/share/dict/words
).你可能想出来angela.ham.lewis.pathos
.现在它将整个字典文件读入一个数组,并从该数组中选择N个随机元素.我想消除该文件的数组或任何其他内存存储,并只读取该文件一次.
(不,这不是一个实际的优化练习.我对算法感兴趣.)
更新:谢谢大家的答案.
答案分为三类:完整读取算法的修改,随机搜索或索引线并随机搜索它们.
随机搜索要快得多,并且相对于文件大小是恒定的,但是基于文件大小而不是字数来分发.它还允许重复(可以避免,但它使算法O(inf)).这是我使用该算法重新实现我的密码生成器.我意识到,通过从搜索点向前读取,而不是向后读取,如果搜索落在最后一行,它会有一个一个一个错误.校正留作编辑的练习.
#!/usr/bin/perl -lw
my $Words = "/usr/share/dict/words";
my $Max_Length = 8;
my $Num_Words = 4;
my $size = -s $Words;
my @words;
open my $fh, "<", $Words or die $!;
for(1..$Num_Words) {
seek $fh, int rand $size, 0 or die $!;
<$fh>;
my $word = <$fh>;
chomp $word;
redo if length $word > $Max_Length;
push @words, $word;
}
print join ".", @words;
Run Code Online (Sandbox Code Playgroud)
然后就是Guffa的答案,这正是我所寻找的; 原始算法的扩展.更慢,它必须读取整个文件,但是按字分发,允许过滤而不改变算法的效率,并且(我认为)没有重复.
#!/usr/bin/perl -lw
my $Words …
Run Code Online (Sandbox Code Playgroud) 所述java.lang.System中类定义了许多公知的特性.
例如,您可以通过查找"java.io.tmpdir"属性来获取JVM的临时目录:
... = System.getProperty("java.io.tmpdir");
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么这些属性没有被定义为常量(例如在java.lang.System类中).与使用文字字符串相比,这将更不容易出错.换句话说,我希望能够做到这一点:
... = System.getProperty(System.JAVA_IO_TMPDIR);
Run Code Online (Sandbox Code Playgroud)
任何想法为什么没有这样做?它甚至可以在未来的Java版本中添加,而不会破坏向后兼容性.还是我错过了一些明显的东西?
使用jQuery为浏览器FF3和IE6/7开发时,在HTML标记上设置自定义属性时是否存在任何兼容性问题?
首先,我知道jQuery的data()
功能,它基本上做了我想要的,但数据不能在一个clone()
函数中存活.这是使用jQuery UI draggable/droppable插件时的一个问题,因为它在拖放过程中克隆了DOM元素.出于这个问题的目的,我需要一个替代方案data()
.
我想在拖放操作之间保留数据.我希望能够将数据注入到拖放操作期间移动的DOM元素中.为此,我可以构建HTML子元素来模拟数据库记录.快速实验表明Firefox使用我想存储数据字段的任何属性名称没有问题.但是,HTML 4规范说某些标签只能包含某些属性名称.使用非标准属性填充DOM会导致与我提到的浏览器不兼容吗?
我正在编写一个C#服务,我希望能够在Windows和Mono上使用它.我刚刚开始尝试使用Mono,我正在尝试确定存储设置的最佳方法,以控制适用于Windows和Mono的服务.
安装服务的设置文件
平台存储中的设置文件(%APPDATA,/ etc,...)
小数据库(可能是SQLite?)
您认为哪个最好,或者您有更好的建议?
我也可能会编写命令行客户端以便更改设置,这会改变设置的存储方式吗?
有没有办法在sqlite中进行重音/变音符号不敏感搜索?
谷歌搜索,我发现了这一点,但我真的不知道如何在C#中创建我的"校对功能".我正在尝试为Sqlite创建pt-br排序规则...
给定一个(char*)字符串,我想找到所有出现的子字符串并用替换字符串替换它.我没有看到任何在<string.h>中实现此功能的简单函数
在Javascript中,您可以使用其原型对象扩展现有类:
String.prototype.getFirstLetter = function() {
return this[0];
};
Run Code Online (Sandbox Code Playgroud)
是否可以使用此方法来扩展DOM元素?
我试图了解Git如何更好地工作.
给定一些任意文件和一些任意数量的提交,git如何决定如何将这些文件拆分成blob,然后使用SHA-1哈希进行唯一标识?
我刚刚将大约10个perl/C/java代码和文本提交到新的git repo中,并且不知何故git将文件分成了几个小段,它是如何决定这些段应该如何划分的呢?
如何使用下面定义的Object()函数将任意数量的参数传递给类构造函数?
<?php
/*
./index.php
*/
function Object($object)
{
static $instance = array();
if (is_file('./' . $object . '.php') === true)
{
$class = basename($object);
if (array_key_exists($class, $instance) === false)
{
if (class_exists($class, false) === false)
{
require('./' . $object . '.php');
}
/*
How can I pass custom arguments, using the
func_get_args() function to the class constructor?
$instance[$class] = new $class(func_get_arg(1), func_get_arg(2), ...);
*/
$instance[$class] = new $class();
}
return $instance[$class];
}
return false;
}
/*
How do I make …
Run Code Online (Sandbox Code Playgroud)