Я пытаюсь реализовать структуру данных, которая была проблемой от www.topcoder.com, но я не могу получить такую же скорость / эффективность, как они.
Вот чтоони спрашивают.
ВОПРОС:
Реализация класса BlockedList, который реализует интерфейс List.Вы можете использовать любой из классов в JCF.Конструктор для этого класса принимает целочисленный размер блока b, и реализация должна иметь следующие характеристики производительности: get (i) и set (i, x) должны выполняться за O (1) раз за операцию add (i, x) и remove (i) должен работать за O (b + min {i, ni} / b) амортизированное время на операцию.
Решение (Неверно, что должно быть намного быстрее: ()
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
/**
* This is a copy of the JCF class ArrayList. It implements the List
* interface as a single array a. Elements are stored at positions
* a[0],...,a[size()-1]. Doubling/halving is used to resize the array
* a when necessary.
*
*
* @param <T> the type of objects stored in the List
*/
class BlockedList<T> extends AbstractList<T> {
/**
* List which will store elements
*/
private List<T> list;
/**
* keeps track of the class of objects we store
*/
Factory<T> f;
/**
* The number of elements stored
*/
int n;
/**
* The block size
*/
int b;
/**
* Constructor
* @param t the type of objects that are stored in this list
* @param b the block size
*/
public BlockedList(Class<T> t, int b) {
this.f = new Factory<T>(t);
this.n = 0;
this.b = b;
this.list = new ArrayList<T>();
}
public int size() {
return n;
}
public T get(int i) {
if (i < 0 || i > n - 1) throw new IndexOutOfBoundsException();
return list.get(i);
}
public T set(int i, T x) {
if (i < 0 || i > n - 1) throw new IndexOutOfBoundsException();
return list.set(i, x);
}
public void add(int i, T x) {
if (i < 0 || i > n) throw new IndexOutOfBoundsException();
if (i >= b ) throw new IndexOutOfBoundsException();
list.add(i,x);
n+=1;
}
public T remove(int i) {
if (i < 0 || i > n - 1) throw new IndexOutOfBoundsException();
T val = list.remove(i);
n-=1;
return val;
}
}
ЦЕЛЬ
Цель состоит в том, чтобы выполнить задание, как они просили, но я пробовал его несколько раз, а сейчас отказался. Я хотел бызнаю, что я сделал неправильно. Также скорости, как я упоминал ранее для get (i) и set (i, x), должны запускаться за O (1) раз за операцию add (i, x) и remove (i) должныработать в O (b + min {i, ni} / b) амортизированное время на операцию.
Ошибка тестирования:
Executing: javac ListTest2.java
Running: java ListTest2 20
Running with n = 20
Correctness testing for topcoder.BlockedList...Exception in thread "main" java.lang.IndexOutOfBoundsException
at topcoder.BlockedList.checkBounds(BlockedList.java:67)
at topcoder.BlockedList.add(BlockedList.java:43)
at java.util.AbstractList.add(AbstractList.java:108)
at topcoder.sanityTests(ListTest2.java:30)
at topcoder.main(ListTest2.java:115)
Program exited with non-zero status, test failed