Implement Hash Map Using Primitive Types
A small coding test that I encountered today.
Question
Using only primitive types, implement a fixed-size hash map that associates string keys with arbitrary data object references (you don't need to copy the object). Your data structure should be optimized for algorithmic runtime and memory usage. You should not import any external libraries, and may not use primitive hash map or dictionary types in languages like Python or Ruby.
The solution should be delivered in one class (or your language's equivalent) that provides the following functions:
- constructor(size): return an instance of the class with pre-allocated space for the given number of objects.
- boolean set(key, value): stores the given key/value pair in the hash map. Returns a boolean value indicating success / failure of the operation.
- get(key): return the value associated with the given key, or null if no value is set.
- delete(key): delete the value associated with the given key, returning the value on success or null if the key has no value.
- float load(): return a float value representing the load factor (`(items in hash map)/(size of hash map)`) of the data structure. Since the size of the dat structure is fixed, this should never be greater than 1.
If your language provides a built-in hashing function for strings (ex. `hashCode` in Java or `__hash__` in Python) you are welcome to use that. If not, you are welcome to do something naive, or use something you find online with proper attribution.
Solution
Key to construct a hash map is to construct several key-value entries.
package datastructures.map;
public class MyEntry<K, V> {
private final K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
}
package datastructures.map;
// import datastructures.map.MyEntry;
public class MyMap<K, V> {
private int fullSize;
private int size;
private int DEFAULT_CAPACITY = 16;
private MyEntry<K, V>[] map = new MyEntry[DEFAULT_CAPACITY];
public MyMap(int size) {
this.size = 0;
this.map = new MyEntry[size];
this.fullSize = size;
}
public V get(K key) {
for (int i = 0; i < size; i++) {
if (map[i].getKey().equals(key)) {
return map[i].getValue();
}
}
return null;
}
public boolean set(K key, V value) {
boolean insert = true;
for (int i = 0; i < size; i++) {
if (map[i].getKey().equals(key)) {
map[i].setValue(value);
insert = false;
}
}
if (insert) {
if (size >= fullSize) {
return false;
}
else {
map[size] = new MyEntry(key, value);
size++;
}
}
return true;
}
public V delete(K key) {
for (int i = 0; i < size; i++) {
if (map[i].getKey().equals(key)) {
V value = map[i].getValue();
map[i] = null;
condenseArray(i);
return value;
}
}
return null;
}
public float load() {
return (float)size / (float)fullSize;
}
private void condenseArray(int start) {
size--;
for (int i = start; i < size; i++) {
map[i] = map[i + 1];
}
}
}
package datastructures.map;
public class Test {
public static void main(String[] args) {
int size = 8;
MyMap<Character, Integer> test = new MyMap<Character, Integer>(size);
test.set('a', 1);
test.set('b', 2);
test.set('c', 3);
test.set('d', 4);
System.out.println(test.get('a'));
System.out.println(test.set('a', 2));
System.out.println(test.get('a'));
System.out.println(test.load());
test.delete('b');
System.out.println(test.load());
}
}
More basic knowledge about Java
Package and Import
Classes under same package need not import each other.
Here, we set three classes in package datastructures.map, and my current path is /home/Desktop
Then, I need to make a directory of datastructures/map under Desktop and put three source codes in that directory.
Meanwhile, I need to compile under Desktop directory.
To compile the Java programs with package statements you have to do use -d option as shown below.
javac -d Destination_folder file_name.java
There can be only one package statement in each source file, and it applies to all types in the file.
Two major results occur when a class is placed in a package:
1. The name of the package becomes a part of the name of the class, as we just discussed in the previous section.
2. The name of the package must match the directory structure where the corresponding bytecode resides.
Constructor
Constructor for object should not include inner types.
For example
public MyMap<K, V>() {} is wrong!
public MyMap() {} is right!
Public Class
(referrence: Tutorialspoint)
Four access level for classes:
1. Visible to the package. the default. No modifiers are needed.
2. Visible to the class only (private).
3. Visible to the world (public).
4. Visible to the package and all subclasses (protected).
Access Control and Inheritance:
1. Methods declared public in a superclass also must be public in all subclasses.
2. Methods declared protected in a superclass must either be protected or public in subclasses; they cannot be private.
3. Methods declared without access control (no modifier was used) can be declared more private in subclasses.
4. Methods declared private are not inherited at all, so there is no rule for them.
Implement Hash Map Using Primitive Types的更多相关文章
- Hash Map (Hash Table)
Reference: Wiki PrincetonAlgorithm What is Hash Table Hash table (hash map) is a data structure use ...
- Java中的原始类型(Primitive Types)与引用类型(Reference Values)
Java虚拟机可以处理的类型有两种,一种是原始类型(Primitive Types),一种是引用类型(Reference Types). 与之对应,也存在有原始值(Primitive Values)和 ...
- Effective Java 49 Prefer primitive types to boxed primitives
No. Primitives Boxed Primitives 1 Have their own values Have identities distinct from their values 2 ...
- How to Map Distinct Value Types Using Java Generics--reference
原文:http://www.codeaffine.com/2015/03/04/map-distinct-value-types-using-java-generics/ Occasionally t ...
- hdu1381 Crazy Search(hash map)
题目意思: 给出一个字符串和字串的长度,求出该字符串的全部给定长度的字串的个数(不同样). 题目分析: 此题为简单的字符串哈hash map问题,能够直接调用STL里的map类. map<str ...
- C# 01 Primitive Types and Expressions
Class Data or Attributes state of the application Methods or Functions have behavior Namespace is a ...
- [LeetCode] Repeated DNA Sequences hash map
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- Hash Map 在java中的解释及示例
目录 HashMap在java中的应用及示例 HashMap的内部结构 HashMap的性能 同步HashMap HashMap的构造函数 HashMap的时间复杂度 HashMap的方法 1. vo ...
- Redis的增删改查 c# key value类型和hash map 类型
using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Generic; us ...
随机推荐
- 关于qt学习的一点小记录(2)
嗯...这次接了个单 要求图形界面,刚好可以巩固并学习下QT.毫不犹豫的就接了 下面记录下出现的问题: 1. QWidget和QDialog QDialog下的槽函数有accept()与reject( ...
- Makefile中使用foreach生成一类规则
CSDN上,有朋友发帖问了这样一个问题(我按自己的理解翻译一下): 当前目录下有四个静态库文件: liba.a libb.a libc.a libd.a.现在想将它们做成一个动态库libp.so. ...
- POJ 3046 Ant Counting DP
大致题意:给你a个数字,这些数字范围是1到t,每种数字最多100个,求问你这些a个数字进行组合(不包含重复),长度为s到b的集合一共有多少个. 思路:d[i][j]——前i种数字组成长度为j的集合有多 ...
- IO之流程与buffer概览
为了说明这个流程,还是用图来描述一下比较直观. 中间过程请参考 <IO之内核buffer----"buffer cache"> <IO之标准C库buffer> ...
- (转) unity 在移动平台中,文件操作路径详解
http://www.unitymanual.com/thread-23491-1-1.html 今天,这篇文章其实是个老生常谈的问题咯,在网上类似的文章也比比皆是,在此我只是做个详细总结方便大家能够 ...
- winform窗体中查找控件
private RichTextBox FindControl() { RichTextBox ret = null; try { ...
- Javascript页面跳转与浏览器兼容
用<meta>标签实现的定时跳转: <meta http-equiv="refresh" content="5 url=http://www.baidu ...
- CSS网页元素居中
1.水平居中:行内元素解决方案 只需要把行内元素包裹在一个属性display为block的父层元素中,并且把父层元素添加如下属性即可: text-align: center 适用元素:文字,链接,及其 ...
- TCP粘包/拆包问题的解决
TCP粘包拆包问题 一个完整的包可能被TCP拆分成多个包,或多个小包封装成一个大的数据包发送. 解决策略 消息定长,如果不够,空位补空格 在包尾增加回车换行符进行分割,例如FTP协议 将消息分为消息头 ...
- uva 10391 Compound Words <set>
Compound Words You are to find all the two-word compound words in a dictionary. A two-word compound ...