summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash
diff options
context:
space:
mode:
authorErich Schubert <erich@debian.org>2014-10-31 03:43:51 +0100
committerAndrej Shadura <andrewsh@debian.org>2019-03-09 22:30:40 +0000
commit596d8876dca5627dd76e8c23bf40a24cc305eeed (patch)
treed269ddb46561469f6b1fff67b19e0cd2b4608f5b /src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash
parentee31d687b1a0e2f2f1e6e71375c7cc3b094919b8 (diff)
parent337087b668d3a54f3afee3a9adb597a32e9f7e94 (diff)
Import Debian changes 0.6.5~20141030-1
elki (0.6.5~20141030-1) unstable; urgency=medium * New upstream beta release * Urgency medium: 0.6.0 suffers from a performance issue with duplicates. * Repackaged tarball from .jar to .tar.bz2 * Add dependency on libsvm3-java * Enable line numbers for debugging (ant debuglevel)
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash')
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java132
-rw-r--r--src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/package-info.java30
2 files changed, 162 insertions, 0 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java
new file mode 100644
index 00000000..ab149c39
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/Unique.java
@@ -0,0 +1,132 @@
+package de.lmu.ifi.dbs.elki.utilities.datastructures.hash;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2014
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import gnu.trove.impl.hash.TObjectHash;
+
+import java.util.Arrays;
+
+/**
+ * This hash set is designed to keep only a unique copy of each object (hence
+ * its name). For this, the method {@link #addOrGet} is the key API, which
+ * allows retrieving existing values.
+ *
+ * @author Erich Schubert
+ *
+ * @param <E>
+ */
+public class Unique<E> extends TObjectHash<E> {
+ /**
+ * Serial version number.
+ */
+ static final long serialVersionUID = 1L;
+
+ /**
+ * Constructor with default size and load factors.
+ */
+ public Unique() {
+ super();
+ }
+
+ /**
+ * Constructor with desired initial size.
+ *
+ * @param initialCapacity desired initial size.
+ */
+ public Unique(int initialCapacity) {
+ super(initialCapacity);
+ }
+
+ /**
+ * Constructor with desired initial size, and with the specified load factor.
+ *
+ * @param initialCapacity desired initial size
+ * @param loadFactor load factor
+ */
+ public Unique(int initialCapacity, float loadFactor) {
+ super(initialCapacity, loadFactor);
+ }
+
+ /**
+ * Inserts a value into the set, unless it is already present.
+ *
+ * This function returns the existing value, if present.
+ *
+ * @param obj Object to insert or retrieve
+ * @return Existing object if already present, or the new object.
+ */
+ @SuppressWarnings("unchecked")
+ public E addOrGet(E obj) {
+ int index = insertKey(obj);
+
+ if(index < 0) {
+ obj = (E) _set[-index - 1];
+ }
+
+ postInsertHook(consumeFreeSlot);
+ return obj;
+ }
+
+ /**
+ * Removes an existing object from the set.
+ *
+ * @param obj Object to remove
+ * @return true if the object was found and removed.
+ */
+ public boolean remove(Object obj) {
+ int index = index(obj);
+ if(index >= 0) {
+ removeAt(index);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void clear() {
+ super.clear();
+
+ Arrays.fill(_set, 0, _set.length, FREE);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected void rehash(int newCapacity) {
+ final int oldCapacity = _set.length, oldSize = size();
+ // Replace data storage:
+ Object oldSet[] = _set;
+ _set = new Object[newCapacity];
+ Arrays.fill(_set, FREE);
+
+ // Reinsert all objects:
+ for(int i = oldCapacity; i-- > 0;) {
+ E o = (E) oldSet[i];
+ if(o != FREE && o != REMOVED) {
+ insertKey(o);
+ }
+ }
+ // Last check: size before and after should be the same
+ reportPotentialConcurrentMod(size(), oldSize);
+ }
+}
diff --git a/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/package-info.java b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/package-info.java
new file mode 100644
index 00000000..03746389
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/utilities/datastructures/hash/package-info.java
@@ -0,0 +1,30 @@
+/**
+ * Hashing based data structures.
+ *
+ * Note: much of the desired functionality is provided by the very good GNU Trove library.
+ *
+ * This package will only contain slight extensions or variations, not provided by Trove already.
+ */
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2014
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.lmu.ifi.dbs.elki.utilities.datastructures.hash; \ No newline at end of file