Загадка: Найдите самый большой прямоугольник (максимальная прямоугольная проблема)

У вас довольно много jQuery-операций, которые, если их собрать во множество строк, могут занимать немалое количество времени. Вместо того, чтобы создавать множество коллекций jQuery (которые имеют некоторые накладные расходы) и пересчитывать индекс, который вы ищете на каждой итерации, рассмотрите использование вместо этого ванильного Javascript, который гораздо более легок. Вы также можете заранее создать массив значений фильтров и связанных с ними индексов, чтобы вам не приходилось перемещаться по DOM, чтобы найти их на каждой итерации:

$(".Filter").on('input', function() {
  $(".rowCount").val(filterGrid());
});

function filterGrid() {
  const values = Array.from(
    document.querySelectorAll('.thead .Filter'),
    elm => elm.value
  );
  
  let rowsShown = 0;
  document.querySelectorAll('.tbody .tr').forEach((tr) => {
    const tds = tr.querySelectorAll('.td');
    const noMatch = values.some((value, i) => {
      if (!value) {
        return;
      }
      const td = tds[i];
      return !td.innerHTML.includes(value);
    });
    if (noMatch) {
      tr.style.display = 'none';
    } else {
      tr.style.display = 'block';
      rowsShown++;
    }
  });
  return rowsShown;
}
[ 111]

Если этого недостаточно, вы можете использовать циклы for вместо методов массива, что сделает вещи немного быстрее (хотя и труднее читать).

Если у вас огромное количество строк в .tbody, и это все еще недостаточно быстро, то вы можете рассмотреть возможность добавления debouncer к слушателю input, так что filterGrid вызывается только, скажем, через 200 мс после того, как последний символ был набран, так что большая операция происходит только тогда, когда у вас есть хотя бы бит уверенности, что только что набранный символ может быть последним пользователь хочет ввести (вместо запуска filterGrid после каждого набранного символа):

let filterTimeout;
$(".Filter").on('input', function() {
  clearTimeout(filterTimeout);
  filterTimeout = setTimeout(() => {
    $(".rowCount").val(filterGrid());
  }, 200);
});
38
задан Mark Renouf 11 August 2008 в 06:26
поделиться

3 ответа

@lassevk

я нашел статью, на которую ссылаются от DDJ: Максимальная Прямоугольная проблема

20
ответ дан 27 November 2019 в 03:46
поделиться

Вот страница, которая имеет некоторый код и некоторый анализ.

Ваша конкретная проблема начинается немного вниз на странице, ищите страницу текст максимальная прямоугольная проблема .

http://www.seas.gwu.edu/~simhaweb/cs151/lectures/module6/module6.html

4
ответ дан 27 November 2019 в 03:46
поделиться

@lassevk

    // 4. Outer double-for-loop to consider all possible positions 
    //    for topleft corner. 
    for (int i=0; i < M; i++) {
      for (int j=0; j < N; j++) {

        // 2.1 With (i,j) as topleft, consider all possible bottom-right corners. 

        for (int a=i; a < M; a++) {
          for (int b=j; b < N; b++) {

ХА-ХА... O (m2 n2).. Это, вероятно, что я придумал бы.

я вижу, что они продолжают разрабатывать optmizations... выглядит хорошим, у меня будет чтение.

2
ответ дан 27 November 2019 в 03:46
поделиться
Другие вопросы по тегам:

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