powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вставка в массив.
17 сообщений из 17, страница 1 из 1
Вставка в массив.
    #39413997
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пятница, вечер, мозги не работают.

Есть массив, возможно в него надо вставить в известные (по индексу) места три элемента.
Грубо говоря, сейчас есть код в духе:
Код: java
1.
2.
3.
if (idxA) insert(arr, idxA, "aaaa")
if (idxB) insert(arr, idxB, "bbbb")
if (idxC) insert(arr, idxC, "cccc")


Это работает если idxA < idxB < idxC. Но если этот порядок нарушен, то последующие вставки сдвигают уже вставленный элемент.
Как бы это решить наиболее элегантно?
...
Рейтинг: 0 / 0
Вставка в массив.
    #39413999
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КМК в задаче - противоречие. Вставлять не двигая элементы - невозможно. Или
это уже не вставка а замена получается.
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414001
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКМК в задаче - противоречие. Вставлять не двигая элементы - невозможно. Или
это уже не вставка а замена получается.
никакого противоречия. Двигать (раздвигать) старые элементы массива нужно. Но новые должны оказаться на указанных местах:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
arr := (1, 2);

idxA = 1;
idxB = 3;
insert arr, idxA, 'a'   # arr -> (a, 1, 2)
insert arr, idxB, 'b'   # arr -> (a, 1, b, 2)

idxA = 3;
idxB = 1;
insert arr, idxA, 'a'   # arr -> (1, 2, a)
insert arr, idxB, 'b'   # arr -> (b, 1, 2, a)
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414007
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНо если этот порядок нарушен, то последующие вставки сдвигают уже вставленный элемент.
Как бы это решить наиболее элегантно?Отсортировать и вставлять в порядке возрастания.
В конкретном случае с тремя числами можно вместо сортировки обойтись IF-ами или min/max-ами.
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414026
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вставлять "в порядке убывания", но двигать на "нужное число позиций", то получится минимизировать число перемещений. Т.е. самую "дорогую" операцию.
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414163
illegant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тупо:
Код: java
1.
2.
3.
4.
i = 0
if (idxA) {insert(arr, idxA, "aaaa"); i++}
if (idxB) {insert(arr, idxB+i, "bbbb"); i++}
if (idxC) insert(arr, idxC+i, "cccc")


не тупо: как предложил Basil A. Sidorov, только еще объединить все вставки в одну функцию, чтобы элементы перемещались только один раз, типа:
Код: java
1.
2.
3.
4.
5.
InsertList.Clear
if (idxA) InsertList.Add(idxA, "aaaa")
if (idxB) InsertList.Add(idxB, "bbbb")
if (idxC) InsertList.Add(idxC, "cccc")
SmartInsert(arr, InsertList)
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414165
illegant
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сорри, тоже туплю, мой "тупой" вариант конечно же не прокатит
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414214
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О! Возникла мысль: :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if (idxA) {
   if (idxB && idxA < idxB) idxA--
   if (idxC && idxA < idxC) idxA--
   insert(arr, idxA, "aaaa")
}
if (idxB) {
   if (idxC && idxB < idxC) idxC--;
   insert(arr, idxB, "bbbb")
}
if (idxC) insert(arr, idxC, "cccc")
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414220
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

кто мешает отсортировать три элементы про порядку их будущего места и затем в этом порядке вставить в массив?
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414347
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivWhite Owl,

кто мешает отсортировать три элементы про порядку их будущего места и затем в этом порядке вставить в массив?Лениво заводить массив ради трех элементов. Было бы их десяток или переменное число - тогда массив без сомнений.
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414358
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

прошу прощения, а что такое
Код: plaintext
1.
2.
   if (idxB && idxA < idxB) idxA--
   if (idxC && idxA < idxC) idxA--


какие тут дополнительные свойства (a,b,c) зашифрованы?
Как они предотвращают idxA от -1?
...
Рейтинг: 0 / 0
Вставка в массив.
    #39414987
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyWhite Owl,

прошу прощения, а что такое
Код: plaintext
1.
2.
   if (idxB && idxA < idxB) idxA--
   if (idxC && idxA < idxC) idxA--


какие тут дополнительные свойства (a,b,c) зашифрованы?
Как они предотвращают idxA от -1?Да, здесь предполагается что все индексные переменные будут иметь правильные значения. И нет, этих проверок тут не показано, так как они не влияют на алгоритм.
...
Рейтинг: 0 / 0
Вставка в массив.
    #39417492
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlО! Возникла мысль: :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if (idxA) {
   if (idxB && idxA < idxB) idxA--
   if (idxC && idxA < idxC) idxA--
   insert(arr, idxA, "aaaa")
}
if (idxB) {
   if (idxC && idxB < idxC) idxC--;
   insert(arr, idxB, "bbbb")
}
if (idxC) insert(arr, idxC, "cccc")



Что-то аналогичное получается - предварительная подстройка значений индексов вставки.
А если не вы не хотите заводить дополнительный массив в случае сортировки, то возможно есть смысл воспользоваться in-place swap:
Код: plaintext
1.
x^=y^=x^=y;//swap x n y values
...
Рейтинг: 0 / 0
Вставка в массив.
    #39418407
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЧто-то аналогичное получается - предварительная подстройка значений индексов вставки.
А если не вы не хотите заводить дополнительный массив в случае сортировки, то возможно есть смысл воспользоваться in-place swap:
Код: plaintext
1.
x^=y^=x^=y;//swap x n y values

Саша, ты забыл. В задаче не только индексы есть, но и значения связанные с индексом. Мало отсортировать индексы, надо еще и помнить какие именно индексы сменили значения.
...
Рейтинг: 0 / 0
Вставка в массив.
    #39418539
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlSashaMercuryЧто-то аналогичное получается - предварительная подстройка значений индексов вставки.
А если не вы не хотите заводить дополнительный массив в случае сортировки, то возможно есть смысл воспользоваться in-place swap:
Код: plaintext
1.
x^=y^=x^=y;//swap x n y values

Саша, ты забыл. В задаче не только индексы есть, но и значения связанные с индексом. Мало отсортировать индексы, надо еще и помнить какие именно индексы сменили значения.
И правда забыл. Тогда пока ничего кроме предварительной подстройки индексов вставки не приходит. Подумаю
...
Рейтинг: 0 / 0
Вставка в массив.
    #39419350
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если количество элементов сравнительно небольшое, то можно организовать цикл подобного вида
Код: plaintext
1.
2.
3.
4.
5.
for(int i=0;i<n;++i){
   if(i in(in1,in2,in3)){
      insert(ps);
   }
}



Хотя это конечно не самый приятный вариант
...
Рейтинг: 0 / 0
Вставка в массив.
    #39419359
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
realloc предлагали ?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вставка в массив.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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