Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #71 (permalink)  
Старый 04.08.2018, 23:06
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 505

Сообщение от Alexandroppolus Посмотреть сообщение
https://javascript.ru/forum/misc/734...tml#post483544 - кто-нибудь пробовал решить?
function smaller(arr) {
   return arr.map(
     (cur, i) => arr.slice(i+1).reduce(
       (sum, cur1) => {
         return (cur1 < cur) ? sum+1 : sum;
       }, 0
     )
   );
}

console.log(smaller([5, 4, 3, 2, 1]), '[4, 3, 2, 1, 0]');
console.log(smaller([1, 2, 3]), '[0, 0, 0]');
console.log(smaller([1, 2, 0]), '[1, 1, 0]');
console.log(smaller([1, 2, 1]), '[0, 1, 0]');
console.log(smaller([1, 1, -1, 0, 0]), '[3, 3, 0, 0, 0]');
console.log(smaller([5, 4, 7, 9, 2, 4, 4, 5, 6]), '[4, 1, 5, 5, 0, 0, 0, 0, 0]');


Не гурман, поэтому никаких послевкусий ))
Ответить с цитированием
  #72 (permalink)  
Старый 05.08.2018, 01:02
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

шум, братец, не все так просто для этой каты решающий фактор скорость.
и даже без использование абстракций (что быстрей как минимум вдвое) не прокатывает =(
function smaller(arr) {
		var newArr = [], x = arr.length;
			for (var i = 0; i<x; i++){
			var s = 0;
			for(var j = i; j<x; j++){
				s = (arr[j] < arr[i]) ? s+1 : s;
			}
			newArr[i]=s;
		}
		return newArr;
	}


Alexandroppolus, тут решение наверное кардинально другое?
Ответить с цитированием
  #73 (permalink)  
Старый 05.08.2018, 01:23
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

j0hnik, у меня мысль примерно также шала, только вместо for - обратные while - меньше буков и иногда быстрее.
Можно ещё добавить "кэш" - сохранять количество и позицию для для конкретной цифры и если таковая нашлась на следующих итерациях - не проходить весь цикл заново, а только до той позиции, прибавляя предыдущий результат и обновляя кэш. Это даст выигрыш в случае множества повторов.
Но в решении не было изюминки, слишком оно в лоб, а потому врядли требуемое, так что я плюнул.)
__________________
29375, 35
Ответить с цитированием
  #74 (permalink)  
Старый 05.08.2018, 01:36
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Aetae,
а while это конечно копейки.
а вот кеш это идея, там массивы по 80000 - 100000 length значения -1000 - 1000
Ответить с цитированием
  #75 (permalink)  
Старый 05.08.2018, 03:01
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

С кэшем примерно так, но как и ожидалось - не проходит
function smaller(arr) {
  var length = arr.length, 
      i = length, j, 
      result = new Array(length),
      cache = Object.create(null);
  while (i--){
    if(arr[i] in cache){
      j = cache[arr[i]];
      cache[arr[i]] = i;
      result[i] = result[j];
    }else{
      cache[arr[i]] = i;
      result[i] = 0;
      j = length;
    }
    while(--j > i)
      if(arr[j] < arr[i]) 
        result[i]++;
  }
  return result;
}
Нужен какой-то трюк.)

...можно ещё запоминать максимальное число и минимальное, в первом случае - просто прибавлять оставшуюся длину, во втором ставить ноль. Но это всё рост "вширь", а надо, думается в глубину.)
__________________
29375, 35

Последний раз редактировалось Aetae, 05.08.2018 в 03:07.
Ответить с цитированием
  #76 (permalink)  
Старый 05.08.2018, 03:14
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Aetae,
Истина где-то рядом!
Проснется подскажет
Ответить с цитированием
  #77 (permalink)  
Старый 05.08.2018, 03:17
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от Aetae
Но это всё рост "вширь", а надо, думается в глубину.)
да, там как минимум еще тройной прирост нужен, это вряд ли спасет
Ответить с цитированием
  #78 (permalink)  
Старый 05.08.2018, 04:03
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от j0hnik
тут решение наверное кардинально другое?
Разумеется, очевидный вложенный цикл не прокатит, как его не оптимизируй
А всё из-за квадратичной сложности. Да, асимптотика здесь рулит.

В качестве подсказки - правильное решение имеет сложность O(n*ln(n)), что на порядки быстрее при данных объёмах.
Ответить с цитированием
  #79 (permalink)  
Старый 05.08.2018, 06:25
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

function smaller(arr) {
	var n = arr.length, node = null, result, newArr = new Array(n);
	function addTo(node, value, smallerCount){
		if(node === null) { //старт
			node = { value: value, lowerCount: 0, count: 1, left: null, right: null }; 
			result = smallerCount;
		}
		else if(node.value === value){ // баланс 
			node.count++;
			result = smallerCount + node.lowerCount;
		}
		else if(value < node.value){ 
			node.lowerCount++;
			node.left = addTo(node.left, value, smallerCount);
			// дублирующее количество правых +1
		}
		else node.right = addTo(node.right, value, smallerCount + node.count + node.lowerCount); // количество меньших чисел
		return node;
	}
	for(var i = n-1; i >= 0; i--) {
		node = addTo(node, arr[i], 0);
		newArr[i] = result;
	}
	return newArr;
}


лучше шестерки под чаек решать, чем так загоняться

Последний раз редактировалось j0hnik, 08.08.2018 в 02:54.
Ответить с цитированием
  #80 (permalink)  
Старый 05.08.2018, 08:34
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

j0hnik,
Чтобы юзеры не слишком загонялись, автор задачи специально не стал добавлять более-менее отсортированные массивы, и можно обойтись обычным бинарным деревом без всяких там балансировок )

А шестерки надоедают быстро, какие-то они все однообразные.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Тестовое задание Yandex xShift Общие вопросы Javascript 22 17.02.2018 21:53
Задание с SIP heeel Firefox/Mozilla 0 12.06.2017 01:12
Интересное задание "Поединок" помогите решить Anton27 Общие вопросы Javascript 1 23.05.2017 22:24
Тестовое задание. Дайте идею. FINoM Оффтопик 14 28.03.2011 10:09
Помогите сделать тестовое задание начального уровня по js makregistr Работа 1 16.12.2010 14:26