我的老师给了我一个英语词汇。
选择随机字母,说'a' 比如写一个字母表中的单词 'apple'用最后一个字'e'写一个 来自e的词,说大象现在来自't' 等等。不允许重复
列出500个单词。 将列表邮寄给老师。 :)
所以我不是自己做,而是在研究一个Java代码,它将为我完成我的功课。 代码似乎很简单。
算法的核心: 从字典中挑选一个满足要求的随机单词。使用RandomAccessFile搜索()。尝试将它放入带有排序的Set(可能是LinkedHashSet)
但问题是拥有30万多个肠衣的庞大字典。 :| 蛮力随机算法不会起作用。
什么是最好,最快捷,最有效的出路?
****更新:**现在我已经编写了代码及其工作原理。如何使其高效,以便选择常用词? 任何包含常见字列表的文本文件?? **
答案 0 :(得分:4)
要么寻找允许您将压缩字典保存在内存中的数据结构,要么只是为您的进程提供更多内存。三十万字不是那么多。
答案 1 :(得分:1)
希望这不会破坏你的乐趣或其他东西,但如果我是你,我会采取这种方法..
伪java:
abstract class Word {
String word;
char last();
char first();
}
abstract class DynamicDictionary {
Map<Character,Set<Word>> first_indexed;
Word removeNext(Word word){
Set<Word> candidates = first_indexed.get(word.last());
return removeRandom(candidates);
}
/**
* Remove a random word out from the entire dic.
*/
Word removeRandom();
/**
* Remove and return a random word out from the set provided.
*/
Word removeRandom(Set<Word> wordset);
}
然后
Word primer = dynamicDictionary.removeRandom();
List<Word> list = new ArrayList<Word>(500);
list.add(primer);
for(int i=0, Word cur = primer;i<499;i++){
cur = dynamicDictionary.removeNext(cur);
list.add(cur);
}
注意:不打算将其视为实际的java代码,只是一种大致解释方法的方法(没有错误处理,如果它真的被使用,没有良好的类结构,没有包围等等)。
我是否应该遇到内存问题,也许我会这样做:
abstract class Word {
int lineNumber;
char last();
char first();
}
如果这还不够,猜猜我会在文件上使用二进制搜索或将其放在数据库等中。
答案 2 :(得分:0)
我认为这样做的方法可能是使用TreeSet
,然后放置所有字典然后使用方法subSet
来检索所需字母开头的所有单词并随机执行子集。
但在我看来,由于数据量的原因,最好的方法是使用带有SQL请求的数据库而不是Java。
答案 3 :(得分:0)
如果我这样做:
class LoadWords {
public static void main(String... args) {
try {
Scanner s = new Scanner(new File("/usr/share/dict/words"));
ArrayList<String> ss = new ArrayList<String>();
while (s.hasNextLine())
ss.add(s.nextLine());
System.out.format("Read %d words\n", ss.size());
} catch (FileNotFoundException e) {
e.printStackTrace(System.err);
}
}
}
我可以使用java -mx16m LoadWords
运行它,它将Java堆大小限制为16 Mb,这对Java来说并不是那么多。我的/usr/share/dict/words
文件中包含大约250,000个单词,因此它可能比您的小一些。
您需要使用与我使用的简单ArrayList<String>
不同的数据结构。也许HashMap
ArrayList<String>
{{1}},以该词的起始字母为主,将是一个很好的首选。
答案 4 :(得分:0)
这是一些单词频率列表: http://www.robwaring.org/vocab/wordlists/vocfreq.html
此文本文件可从上述链接访问,包含最常用的前2000个单词: http://www.robwaring.org/vocab/wordlists/1-2000.txt
答案 5 :(得分:-1)
目标是增加您的英语词汇量 - 而不是增加您计算机的英语词汇量。
如果你没有分享这个目标,你为什么(或你的父母)支付学费?