Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Почему нельзя использовать byte[] в качестве ключа в HashMap?
Почему нельзя использовать byte[] в качестве ключа в HashMap?
hashMap.put(500, 1);
int value = hashMap.get(500);
7. Как устроена HashMap?
Добавление, поиск и удаление элементов выполняется за константное время.
это же нужно целенаправленно стрелять себе в ногу :)
в Яндексе теперь
студенты собеседуют сеньёров
На задачку даю часа 3-4.
Object get(int index);
void put(int index, Object value);
void clearAll();
public class Node<T>
{
public T Value { get; set; }
public Node<T> Next { get; set; }
}
public static Node<T> ReverseInPlace<T>(Node<T> root)
{
Node<T> prev = null;
Node<T> curr = root;
while (curr != null)
{
var next = curr.Next;
curr.Next = prev;
prev = curr;
curr = next;
}
return prev;
}
while(list != null) {
next = list.next;
list.next = prev;
prev = list;
list = next;
}
int K = 3; //количество необходимых чисел
int N = 15; //количество элементов в массиве.
var random = new Random();
var randomIndexes = new int[K]; // случайные индексы элементов, которые мы должны вытащить из массива
for (int i = 0; i < K; i++)
{
var prev = i > 0 ? (randomIndexes[i - 1] + 1) : 0;
randomIndexes[i] = random.Next(prev, N - (K - i - 1));
}
var shift = random.Next(0, N);
for (int i = 0; i < K; i++)
{
randomIndexes[i] = (randomIndexes[i] + shift) % N;
}
... // тут возвращаем все элементы с найденными индексами
то ли я вхожу в 10% тех, кто может это написать
for(;;){
while(left<right && cmp(A[left],A[0])<=0) left++;
while(left<right && cmp(A[right],A[0])>=0) right--;
if(left>=right) break;
swap(A[left++],A[right--]);
}
По поводу MAXINT — никто не заставляет использовать int для хранения версии
void Clear(){
int Vnew=(CurVersion+1)%N;
Versions[CurVersion]=Versions[Vnew]=CurVersion;
CurVersion=Vnew;
}
class FastSet{
int N; // size of array
int CurVersion; // current version of data, clearings counter
object[] Values; // values
int[] Versions; // versions of elements
public FastSet(int _N){
N=_N;
Values=new object[N];
CurVersion=1%N; // or N==1 ? 0 : 1
Versions=new int[N]; // versions of all elements are 0, just out of date
}
public void Clear(){
int NewVer=(CurVersion+1)%N;
Versions[CurVersion]=Versions[NewVer]=CurVersion;
Values[CurVersion]=null; // for case N=1
CurVersion=NewVer;
}
public void Put(int ind,object val){
if(ind<0 || ind>=N) return;
Values[ind]=val;
Versions[ind]=CurVersion;
}
public object Get(int ind){
if(ind<0 || ind>=N || Versions[ind]!=CurVersion) return null;
return Values[ind];
}
}
clearAll() {
array = new Object[initSize];
}
array = new Object[initSize]
put(K key, V value)
V get(Object key).
But the compiler doesn't know the type — it could be a Foo, or SubFoo, or SubSubFoo, or who knows what? Thus the compiler would have to forbid everything — the only safe parameter to a method like this is null.
This is the behavior you want for a method like Set.add() — if you can't make damn sure of the type, don't allow it.
Какая оценка временной сложности выборки элемента из HashMap? Гарантирует ли HashMap указанную сложность выборки элемента?Как я уже тут сказал вопрос очень странный, если рассматривать именно теорию сложностей, то гарантирует константную, да.
7. Как устроена HashMap?
Это второй из списка самых популярных вопросов по коллекциям. Уж даже не помню был ли случай, когда этот вопрос мне не задавали.
Вкратце, HashMap состоит из «корзин» (bucket`ов).
Штирлиц ворвался к Мюллеру, врезал ему в ухо, отобрал секретные документы и спросил:
— А не найдется ли у вас канцелярских скрепок?
Штирлиц знал, что в разговоре всегда запоминается последняя фраза, и если Мюллера спросят:
— Зачем приходил Штирлиц? – тот наверняка ответит:
— За скрепками.
Depending on the machine architecture and the programming language, the answer will be that the vector is best for small to medium values of N. When I ran the experiment on my 8-Gbyte laptop, I found N to be much larger than 500,000.
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
java.util.LinkedList
нету метода «вставка/удаление элементов отдельно от поиска». Я рад, безусловно, что вы прочитали книжку Кормена, только вот топик не о том.add
и remove
у LinkedList
'ового listIteartor
'а начинается с вызова замечательного метода checkForComodification()
.The list-iterator is fail-fast: if the list is structurally modified at any time after the Iterator is created, in any way except through the list-iterator's ownremove
oradd
methods, the list-iterator will throw aConcurrentModificationException
.
addAll(int index, Collection<? extends E> c)
. Он тоже вполне себе за O(N+M) работает без всяких listIterator
'ов.listIterator
быстрее. Например, когда позиции локализованы.удалить m идущих подряд элементов, начиная с элемента A
list.sublist(0, n).addAll(list.sublist(m+n, N))
проделать то же самое, но чередуя с элементами коллекции (т.е. вставить свой элемент, пропустить один существующий, вставить следующий свой элемент)
Удалите все четные элементы in-place.
Начнем с того, что это Вы сказали — «я говорю — «программистом», а не «Java-программистом».». И Ваш пост я прочитал, как «тот, кто не знает подробностей реализации библиотеки Java образца 2012 года (о которых, собственно, шла речь в исходной статье), не может осмелиться назвать себя программистом».
for(size_t i = 0; i < something.size(); ++i) {
/* blah-blah */
}
Но как это поможет определить стратегию роста размера HashMap или ArrayList? Во сколько раз увеличивается размер того же ArrayList — в два? в полтора? Или в 1.32 раза
Потом, вероятно, полезть в документацию, посмотреть, реализованы ли нужные структуры в стандартных библиотеках
создавать ArrayList из int-ов я буду только если меня совсем не волнует производительность
Если нет — подумать, доверяете ли вы (или ваш начальник) сторонним библиотекам, или предпочтете реализовывать самостоятельно.
И в критических случаях всё равно придётся проверить скорость стандартной реализации и сравнить её с самодельной.
Пока в активную разработку эта задача не пошла, но когда пойдёт — придётся разбираться, что там со скоростью, и какими алгоритмами пользоваться.
То есть, не только версия Java не важна в данном случае, не важно, что это Java. Хеш-таблица как структура данных всегда имеет определенное устройство, будь она в Java, C++, C#, Python etc.
А мне наоборот очень удивительно, что вас изумляет существование строгого стандарта языка, на котором пишется крайне много вещей, в том числе таких, от скорости работы которых могут зависеть человеские жизни. Разумеется сложность операций ограничена сверху!
Я вас не понимаю. То вам асимптотика не важна, то стала жутко важной константа в асимптотике. Странно
Лезть в документацию выяснять, есть ли в стандартной библиотеке связный список или массив? Вы вчера вечером программиравать начали? Это знать надо.
Снова вам стала важна константа в асимтотике. Так важна вам скорость работы используемых коллекций или не важна?
Вы в себе уверены больше, чем в создателях стандартной библиотеки?
Кто же вы?
Хотите обогнать что? C#-шарповскую стандартную сортировку (на парах uint, ulong)? Офигеть. Удачи.
Вы это засчитаете за ответ? Или скажете «не смог ответить на второй вопрос — значит, не программист»? И засчитает ли этот ответ тот, кто проводит собеседование?
Но если на интервью спросят «как растёт ArrayList?» — опять придётся угадывать?
Библиотека — не часть языка. Она от языка, конечно, иногда зависит, но язык от неё — нет
После того, как моя самописная сортировка целых чисел (на C++) обогнала std::sort (немного — на 5-15%, подробности здесь
… реализовывать такие вещи, как массив, список, множество, ассоциативный массив — самостоятельно? И что, вы реально этим на работе занимаетесь? И вам за это платят?
Очень вас прошу, поделиться с общественностью результатом.
У вас есть свои реализации нетривильных вещей, вы сказали, что вам была необходима очередь с приоритетами с хорошей скоростью работы. Были такие задачи. Тогда я не совсем понимаю, почему вам без разницы, чем вы пользуетесь.
IComparer
в этом методе, но, насколько я понял, нужно химичить, чтобы Comparer
на основе lambda превратить в IComparer
.void delete_word(const std::string& word)
(как могут быть устроены методы, с помощью которых она реализована).
Java собеседование. Коллекции