编辑:修正错字和歧义试图修复。
我在文本文件中有一个五位数整数的列表。预期的数量只能与5位整数可以存储的数量一样大。无论有多少,该文件中的FIRST行告诉我存在多少个整数,因此永远不需要调整大小。例如:
lastNameEndingInA
共有4行。第一个说文件中有三个5位整数。接下来的三行包含这些整数。
我想读取这个文件并存储整数(不是第一行)。然后我希望能够搜索这个数据结构很多,没有别的。我想做的就是读取数据,将其放入结构中,然后能够确定是否存在特定的整数。删除将永远不会发生。在这个结构上做的唯一事情将是插入和搜索。
您认为适当的数据结构是什么?我最初的想法是一种二叉树;但是,经过思考,HashTable可能是最好的实现。想法和帮助吗?
答案 0 :(得分:1)
看起来你的要求是
如果你正在处理一个足够小的"整数范围 - 比如,大约16,000,000左右的整数,你可以使用一个位向量。您每个号码存储一位,最初都为零,然后在输入数字时将这些位设置为激活。这具有极快的查找速度和极快的设置,但如果整数可以是完全任意的,则存储器非常密集且不可行。这可能会由BitSet
建模。
如果您正在处理任意整数,那么哈希表可能是最好的选择。通过良好的哈希函数,您可以在表格槽中获得很好的分布,并且可以非常快速地进行查找。您需要一个HashSet
。
如果您绝对必须不惜一切代价保证最坏情况下的性能并且您正在处理任意整数,请使用均衡的BST。 BST中的间接成本使得它们比其他数据结构慢一些,但平衡的BST可以保证哈希表的最坏情况效率。这将由TreeSet
表示。
答案 1 :(得分:0)
如果每个号码出现的次数并不重要(如您所说,只插入并查看号码是否存在),那么您最多只有100,000个号码。只需创建一个布尔数组:
boolean numbers = new boolean[100000];
这应该只需要100千字节的内存。
然后代替添加一个数字,如11111,22222,333333:
numbers[11111]=true;
numbers[22222]=true;
numbers[33333]=true;
要查看是否存在数字,请执行以下操作:
int whichNumber = 11111;
numberExists = numbers[whichNumber];
你有。易于阅读,更容易保持。
答案 2 :(得分:0)
鉴于此
您可以简单地使用某种形式的位图。
e.g。创建一个byte[12500]
(100,000位意味着100,000个布尔值存储0-99,999)
“插入”数字N表示打开第N位。搜索数字N表示检查第N位是否打开。
插入逻辑的Pseduo代码是:
bitmap[number / 8] |= (1>> (number %8) );
搜索看起来像:
bitmap[number/8] & (1 >> (number %8) );
如果你理解了基本原理,那么对你来说就是一个更好的消息:在Java中,我们已经有了BitSet
这就是我在上面描述的内容。
所以代码看起来像这样:
BitSet bitset = new BitSet(12500);
// inserting number
bitset.set(number);
// search if number exists
bitset.get(number); // true if exists
答案 3 :(得分:0)
Set
是“查找”的首选数据结构,以下是实现此目标所需的少量代码:
Scanner scanner = new Scanner(new FileInputStream("myfile.txt"));
Set<Integer> numbers = Stream.generate(scanner::nextInt)
.limit(scanner.nextInt())
.collect(Collectors.toSet());