package de.lmu.ifi.dbs.elki.utilities.datastructures.heap; /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2013 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 . */ import java.util.Comparator; /** * Heap class that is bounded in size from the top. It will keep the bottom * {@code k} Elements only. * * @author Erich Schubert * * @param Element type. Should be {@link Comparable} or a {@link Comparator} * needs to be given. */ public class TopBoundedHeap extends Heap { /** * Maximum size. */ protected int maxsize; /** * Constructor with maximum size only. * * @param maxsize Maximum size */ public TopBoundedHeap(int maxsize) { this(maxsize, null); } /** * Constructor with maximum size and {@link Comparator}. * * @param maxsize Maximum size * @param comparator Comparator */ public TopBoundedHeap(int maxsize, Comparator comparator) { super(maxsize + 1, comparator); this.maxsize = maxsize; assert (maxsize > 0); } @Override public void add(E e) { if (super.size() < maxsize) { // Just offer. super.add(e); return; } // Peek at the top element, return if we are worse. final int comp; if (comparator == null) { @SuppressWarnings("unchecked") Comparable c = (Comparable) e; comp = c.compareTo(queue[0]); } else { comp = comparator.compare(e, queue[0]); } if (comp < 0) { return; } if (comp == 0) { handleOverflow(e); } else { // Otherwise, replace and repair: E prev = super.replaceTopElement(e); handleOverflow(prev); } } /** * Handle an overflow in the structure. This function can be overridden to get * overflow treatment. * * @param e Overflowing element. */ protected void handleOverflow(E e) { // discard extra element } /** * Get the maximum size. * * @return the maximum size */ public int getMaxSize() { return maxsize; } }