Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / небольшой вопрос с коллекциями / 20 сообщений из 20, страница 1 из 1
23.11.2015, 20:17
    #39111477
mightyducksfan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Есть два ArrayList одинакового размера list1(1,2,3) и list2(4,5,6).
нужно записать в list1 эл-ты двух листов , которые идут последовательно [1,4,2,5,3,6].
Причем нужна высокая эффективность алгоритма.
...
Рейтинг: 0 / 0
23.11.2015, 21:29
    #39111497
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
начинай. потом запости сюда свое решение.
...
Рейтинг: 0 / 0
23.11.2015, 21:54
    #39111515
mightyducksfan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
  ListIterator iteratorA = a.listIterator(); 
		Iterator iteratorB = b.iterator();
		
		while (iteratorB.hasNext()) {
			
			iteratorA.next();
			iteratorA.add(iteratorB.next());
			
		}
...
Рейтинг: 0 / 0
23.11.2015, 23:13
    #39111537
mightyducksfan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
эффективность алгоритма O(n) нужна
...
Рейтинг: 0 / 0
23.11.2015, 23:37
    #39111552
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
mightyducksfanЕсть два ArrayList одинакового размера list1(1,2,3) и list2(4,5,6).
нужно записать в list1 эл-ты двух листов , которые идут последовательно [1,4,2,5,3,6].
Причем нужна высокая эффективность алгоритма.
Указав реализацию ArrayList ты искусственно ограничил нас в алгоритмах. Это печально.

Но если отойти от реализации и если договориться что один из списков - read-only то на базе связного
списка (CustomLinkedList) можно сделать эту операцию за фиксированное время.
...
Рейтинг: 0 / 0
24.11.2015, 09:11
    #39111661
mightyducksfan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
У меня в задаче были именно Arraylist.
...
Рейтинг: 0 / 0
24.11.2015, 09:17
    #39111669
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
mightyducksfanэффективность алгоритма O(n) нужна
А у вас какая получилась? Для пущей эффективности можно capacity задать, так как ожидаемый размер известен.
...
Рейтинг: 0 / 0
24.11.2015, 12:03
    #39111931
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
mightyducksfan,

Не каждый list одни и те же операции позволяет сделать за O(n)
...
Рейтинг: 0 / 0
24.11.2015, 12:04
    #39111932
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Сергей Арсеньев,


Но с ArrayList все просто.
Новый размером как два старых и последовательно из каждого в новый.
Подмену старого.
...
Рейтинг: 0 / 0
24.11.2015, 12:53
    #39111998
mightyducksfan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
ListIterator iteratorA = a.listIterator(); 
		Iterator iteratorB = b.iterator();
		
		while (iteratorB.hasNext()) {
			
			iteratorA.next();
			iteratorA.add(iteratorB.next());
			
		}


т.е. эффективность этого алгоритма O(n) ?
Может кто-нибудь объяснить почему эффективность равна O(n)?
мы ведь пробегаем по всем элементам n и при добавлении тоже эл-ты сдвигаются
...
Рейтинг: 0 / 0
24.11.2015, 13:01
    #39112006
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
mightyducksfanи при добавлении тоже эл-ты сдвигаются
Зачем они сдвигаются, если добавлять в конец?
...
Рейтинг: 0 / 0
24.11.2015, 13:03
    #39112007
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Blazkowiczmightyducksfanи при добавлении тоже эл-ты сдвигаются
Зачем они сдвигаются, если добавлять в конец?
Аа, тьху. Понял. Так это. А 3й массив принципиально нельзя заводить? В этом вся соль задачи или что?
...
Рейтинг: 0 / 0
24.11.2015, 13:07
    #39112013
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
...
Рейтинг: 0 / 0
24.11.2015, 13:10
    #39112019
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
mightyducksfan,

Идея проста до нельзя. Добавляем 1й массив сам в себя. Затем читаем его с середины, а пишем с начала.
...
Рейтинг: 0 / 0
24.11.2015, 14:15
    #39112132
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Можно было-бы создать

Код: java
1.
2.
public ChainedList implements List{
}

но действующее ограничение на ArrayList всё портит.
...
Рейтинг: 0 / 0
24.11.2015, 14:26
    #39112146
mightyducksfan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
да я упустил.. это перемешивание должно быть в методе, который возвращает void .
И получается 3 массив мы уже не заведем
...
Рейтинг: 0 / 0
24.11.2015, 14:31
    #39112153
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
mightyducksfanда я упустил.. это перемешивание должно быть в методе, который возвращает void .
И получается 3 массив мы уже не заведем
Почему нет? Локальной переменной, с последующим копированием в один из оригиналов. Мы всё равно останемся в O(n) с фиксированым числом проходов по длине массива.
...
Рейтинг: 0 / 0
24.11.2015, 15:16
    #39112238
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
mightyducksfan,

Тебе же написали как использовать сам Список как третий - за счет добавления самого себя.
Можно и просто увеличить размер и идти с конца (середины).

Но за такое на экзамене 5 не поставят. :)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public class ArrayMixer {

  public static void mix(@NotNull final ArrayList destination, @NotNull final ArrayList source) {
    final int l = destination.size();
    if (l < 1) return;
    if (l != source.size()) throw new IndexOutOfBoundsException();
    destination.ensureCapacity(l * 2);
    Field f = null;
    try {
      f = Unsafe.class.getDeclaredField("theUnsafe");
      f.setAccessible(true);
      Unsafe unsafe = (Unsafe) f.get(null);
      f = destination.getClass().getDeclaredField("elementData");
      f.setAccessible(true);
      Object[] o = (Object[]) f.get(destination);
      for (int i = 0; i < l; i++) {
	o[(l - i) * 2 - 1] = source.get(l - i - 1);
	o[(l - i) * 2 - 2] = destination.get(l - i - 1);
      }
      f = destination.getClass().getDeclaredField("size");
      unsafe.putInt(destination, unsafe.objectFieldOffset(f), l * 2);
    } catch (NoSuchFieldException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }

  }
}

...
Рейтинг: 0 / 0
24.11.2015, 22:19
    #39112707
Роман_мск77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Вот такой есть вариант:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestOne {
public static void main(String[] args) {
List<Long> oneList = new ArrayList<Long>();
List<Long> twoList = new ArrayList<Long>();
List<Long> includeList = new ArrayList<Long>();
oneList.add(1L);
oneList.add(2L);
oneList.add(3L);

twoList.add(4L);
twoList.add(5L);
twoList.add(6L);

Iterator<Long> iter = oneList.iterator();
while(iter.hasNext()) {
Long tmp = iter.next();
includeList.add(tmp);
iter.remove();
Iterator<Long> iter2 = twoList.iterator();
while(iter2.hasNext()) {
Long tmp2 = iter2.next();
includeList.add(tmp2);
iter2.remove();
break;
}
}
System.out.println("========>"+includeList.toString());
}

}



Результат
========>[1, 4, 2, 5, 3, 6]
...
Рейтинг: 0 / 0
25.11.2015, 20:04
    #39113540
mightyducksfan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
небольшой вопрос с коллекциями
Роман_мск77Вот такой есть вариант:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TestOne {
public static void main(String[] args) {
List<Long> oneList = new ArrayList<Long>();
List<Long> twoList = new ArrayList<Long>();
List<Long> includeList = new ArrayList<Long>();
oneList.add(1L);
oneList.add(2L);
oneList.add(3L);

twoList.add(4L);
twoList.add(5L);
twoList.add(6L);

Iterator<Long> iter = oneList.iterator();
while(iter.hasNext()) {
Long tmp = iter.next();
includeList.add(tmp);
iter.remove();
Iterator<Long> iter2 = twoList.iterator();
while(iter2.hasNext()) {
Long tmp2 = iter2.next();
includeList.add(tmp2);
iter2.remove();
break;
}
}
System.out.println("========>"+includeList.toString());
}

}



Результат
========>[1, 4, 2, 5, 3, 6]

так эффективность алгоримта будет O(n*n) . нужна O(n)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / небольшой вопрос с коллекциями / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]