Самый быстрый алгоритм для кругового сдвига N измеренный массив для положения M

Вы должны использовать $(this) и .next(), поэтому вы должны получить доступ к нажатому элементу.

$(document).ready(function(){
  $(".item-btn").click(function(){
    $(this).next(".item-price").toggle();
  });
});
li{
list-style:none;
background:#ddd;
margin-bottom:30px;
padding:5px;
}
.item-price{
display:none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<div class="main-list">
	<ul class="lict-block">
		<li class="item">
			<div class="item-img"></div>
			<div class="item-content">
				<div class="item-btn">Show Price</div>
				<div class="item-price">
					<h3>23.66</h3>
				</div>
			</div>
		</li>
		<li class="item">
			<div class="item-img"></div>
			<div class="item-content">
				<div class="item-btn">Show Price</div>
				<div class="item-price">
					<h3>23.66</h3>
				</div>
			</div>
		</li>
		<li class="item">
			<div class="item-img"></div>
			<div class="item-content">
				<div class="item-btn">Show Price</div>
				<div class="item-price">
					<h3>23.66</h3>
				</div>
			</div>
		</li>
	</ul>
</div>

32
задан 0xCursor 16 October 2018 в 06:22
поделиться

6 ответов

Если вам нужно время O (n) и не использовать лишнюю память (поскольку был указан массив), используйте алгоритм из книги Джона Бентли «Programming Pearls 2nd Edition». Он дважды меняет местами все элементы. Не так быстро, как использование связанных списков, но требует меньше памяти и концептуально прост.

shiftArray( theArray, M ):
    size = len( theArray )
    assert( size > M )
    reverseArray( theArray, 0, size - 1 )
    reverseArray( theArray, 0, M - 1 )
    reverseArray( theArray, M, size - 1 )

reverseArray (anArray, startIndex, endIndex) меняет порядок элементов с startIndex на endIndex включительно.

52
ответ дан 27 November 2019 в 19:49
поделиться

В зависимости от структуры данных, которую вы используете, вы можете сделать это за O (1). Я думаю, что самый быстрый способ - сохранить массив в виде связанного списка и иметь хеш-таблицу, которая может преобразовывать «индекс» в массиве в «указатель» на запись. Таким образом, вы можете найти соответствующие головы и хвосты в O (1) и выполнить переподключение в O (1) (и обновить хеш-таблицу после переключения в O (1)). Это, конечно, было бы очень "беспорядочным" решением, но если все, что вас интересует, это скорость сдвига, это подойдет (за счет более длительной вставки и поиска в массиве, но он все равно останется O ( 1))

Если у вас есть данные в чистом массиве, я не думаю, что вы можете избежать O (n).

С точки зрения программирования, это зависит от того, какой язык вы используете.

Например, в Python вы можете «разрезать»

1
ответ дан 27 November 2019 в 19:49
поделиться

Настройте его с помощью указателей, и это почти не займет времени. Каждый элемент указывает на следующий, а «последний» (последнего нет; в конце концов, вы сказали, что он был круговым) указывает на первый. Один указатель на «начало» (первый элемент) и, возможно, длину, и у вас есть свой массив. Теперь, чтобы сделать смену, просто проведите указателем начала по кругу.

Попросите хороший алгоритм, и вы получите разумные идеи. Попросите самый быстрый , и вы получите странные идеи!

7
ответ дан 27 November 2019 в 19:49
поделиться

Это просто вопрос представления. Сохраните текущий индекс как целочисленную переменную, а при обходе массива используйте оператор по модулю, чтобы знать, когда следует оборачиваться. Сдвиг тогда только изменяет значение текущего индекса, оборачивая его вокруг размера массива. Это, конечно, O (1).

Например:

int index = 0;
Array a = new Array[SIZE];

get_next_element() {
    index = (index + 1) % SIZE; 
    return a[index];
}

shift(int how_many) {
    index = (index+how_many) % SIZE;
}
22
ответ дан 27 November 2019 в 19:49
поделиться

Сохранение двух индексов в массиве, один индекс начинается с начала до конца массива. Другой индекс начинается с позиции M от last и проходит по последним M элементам любое количество раз. Принимает O (n) все время. Дополнительного места не требуется.

circleArray(Elements,M){
 int size=size-of(Elements);

 //first index
 int i1=0;

 assert(size>M)

 //second index starting from mth position from the last
 int i2=size-M;

 //until first index reaches the end
 while(i1<size-1){

  //swap the elements of the array pointed by both indexes
  swap(i1,i2,Elements);

  //increment first pointer by 1
  i1++;

  //increment second pointer. if it goes out of array, come back to
  //mth position from the last
  if(++i2==size) i2=size-M;

 }
}
0
ответ дан 27 November 2019 в 19:49
поделиться

circleArray есть некоторые ошибки, и он не работает во всех случаях!

Цикл должен продолжаться , пока i1 НЕ i1 .

void Shift(int* _array, int _size, int _moves)
{
    _moves = _size - _moves;
    int i2 = _moves;
         int i1 = -1;
         while(++i1 < i2)
    {
        int tmp = _array[i2];
        _array[i2] = _array[i1];
        _array[i1] = tmp;
        if(++i2 == _size) i2 = _moves;
    }
}
0
ответ дан 27 November 2019 в 19:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: