Как стать автором
Обновить
-3
0
brom_portret @brom_portret

Пользователь

Отправить сообщение

а, так я то писал что задача как раз в том чтобы избавиться от цикла поиска максимума. Так то оно быстрее если ядра есть лишние и бесплатные. В моем случае такой халявы не было :)

так в этом собственно и суть.
chat gpt отлично пишет код если задача поставлена максимально понятно и корректно. строк так до 1000 длинной. Так что тут заслуга не чат гпт, а автора который все это придумал, грамотно декомпозировал и понятно изложил в промпте. Кстати вероятно именно этот навык в ближайшее время станет более востребованным чем просто кодинг и часть программистов которые не оч хорошо умеют четко и понятно формулировать мысли останется за бортом.

>>Порядок операций здесь неважен.
верно.

>>Например, если первая часть массива приблизилась к maxValue на 50% и вторая часть на 90%, то суммарно обе части вместе приблизились к maxValue на 95%.

a := calculate([]int{50, 50})
b := calculate([]int{100, 100})
c := calculate([]int{50, 50, 100, 100})
d := calculate([]int{50, 100})
fmt.Println(a,b,c,d)
18 36 39.160000000000004 22


как вы заметили порядок не важен, но я не понял что за формулы вы собираетесь применить чтобы получилось f(18, 36) = f(22, 22) = 39.16

>> можно дополнительно разбить этот массив, к примеру, на 8 частей и считать каждую часть на отдельном ядре.

Я не все условия сказал на самом деле. Много ядер я использовать не хотел, поскольку мы в облаке и ресурсы не бесплатны. И самое важное, хотелось чтобы эта функция могла работать со стримом чтобы для обработки скажем 2гб данных не нужно было хранить все данные памяти, а обрабатывать чанками.

мало желающих. давал в качестве собеса несколько раз. Один чел начал двигаться в правильном направлении, но там быстро не решить ее если первый раз видишь. Я когда с ней столкнулся, несколько дней потратил пока нашел способ оптимизации и пару дней еще на отладку и тестирование.

собственно если кому интересно то вот:

func calculate(values []int) float64 {
	// Сортировка чтобы найти максимум
	sort.Ints(values)
	last := len(values) - 1
	maxValue := values[last];

	var aggregatedValue float64 = 0.0
	for i := last; i >= 0; i-- {
		value := values[i]
		delta := float64(maxValue) - aggregatedValue
		amount := delta * (math.Pow(float64(value) / float64(maxValue), 3) / 5)
		aggregatedValue += amount
	}
	return aggregatedValue;
}

проблема этой функции в том что нужно две итерации.
первая чтобы найти максимум, вторая чтобы получить результат.
нужно сделать так чтобы была только одна итерация, т.е. убрать sort в начале.

Похоже что так. у меня есть хитрая задача по оптимизации которой нет в инете, я на ней тестирую LLM. Пока ни одна даже близко не приблизилась к решению. Сейчас проверил на o1-preview, результат тот же самый, только в разы медленнее.

И так, сознание представляет собой развитый активный гиперграф с пятью (пока) механизмами которые могут иметь различную степень развитости: механизм Интерпретатор, система подкрепления, чувство собственного тела, абстрактное мышление, речь.

Довольно странная формулировка получилась. А что, без речи сознания быть не может? А без абстрактного мышления? А так ли необходим ли интерпретатор? Возможно сознание может быть и без интерпретатора, речи и абстрактоного мышления но другое?

а как быть например с Исландией где используются не только patronymic но и matronymic names?

я прочитал и понял так, что нет и не может быть доказательств, что психоанализ или КПТ работает, но психоанализ обычно сильно дольше и дороже. Если вы разбираетесь в теме, не могли бы вы объяснить простыми словами как именно психоанализ работает? Насколько я понимаю, он полезен в случаях когда проблемы вызваны какой-то ситуацией в прошлом (травмой), о которой пациент как бы даже не знает или не помнит и в таком случае метод свободных ассоциаций или анализа сновидений может действительно привести к некому инсайту (причем не обязательно правдивому), который поможет человеку избавиться от нежелательных паттернов или схем. В таком случае (когда травма далеко в прошлом и пациент ее не помнит и не замечает) кажется, КПТ действительно врядли поможет, а психоанализ скорее да. Исходя из того что вы написали я бы предположил что начинать надо именно с КПТ, и если проблема лежит глубже, то тогда уже искать психоаналитика, он может поможет, а может и нет, гарантии никакой нет.

и еще вот была на хабре хорошая статья про то что не так в России с психологами https://habr.com/ru/articles/517062/

Я сейчас читаю Роберта Лихи - Техники когнитивной психотерапии, и суть там в том чтобы найти устоявшиеся нерациональные схемы поведения и мышления которые мешают жить, вкладывая в депрессию или тревожность и изменить их, показав что можно думать иначе, прежде всего с помощью рациональности, а никаким образом не оправдывая их. Возьмем ситуацию описанную автором, где человек боится неудач потому что учитель вызывал его к доске и он не смог ответить и все смеялись. В таком случае пациенту предлагается осознать эту устоявшуюся схему и ее изменить и предлагаются методики как это сделать, чтобы человек понял что он вовсе не лузер, а наоборот что он смог получить диплом, у него есть работа с которой он справляется и т.д. и на самом деле он никакой не неудачник. А то что рассказывает автор, когда вместо исправления схемы создается другая схема, которая оправдывает его за счет его негативного опыта в прошлом, ну это как бы чушь собачья, нормальный терапевт такого делать не будет, это полностью противоречит современным подходам. Т.Е. нужно все таки различать самозванцев которых разумеется среди психотерапевтов не мало, и нормальных, годных, психотерапевтов, которые действительно учат мыслить рационально и исправляют неправильные паттерны мышления и поведения. Поскольку автор статьи ничего про это не рассказал, я бы не стал доверять его мнению, а вместо это рекомендовал бы почитать нормальные книжки (того же Роберта Лихи) про современные методы психотерапии, прежде всего КПТ, чтобы хотя бы понимать что такое современные подходы в психотерапии.

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

ТЕРАПЕВТ: Вы считаете себя глупым и безответственным,
потому что именно так воспринимал вас ваш отец. А как вы думаете,
какой могла бы быть ваша новая, более позитивная схема?
ПАЦИЕНТ: Что я умный, нормальный парень.
ТЕРАПЕВТ: Хорошо. И какие доказательства тому, что вы умный,
можно было бы найти?
ПАЦИЕНТ: Я окончил университет, получил степень магистра,
неплохо справляюсь с работой. У меня высокий IQ.
ТЕРАПЕВТ: А если бы вы считали себя умным, какие мысли
возникали бы у вас при знакомстве с новыми людьми?
ПАЦИЕНТ: Я бы думал, что они увидят, какой я сообразительный.
ТЕРАПЕВТ: А как насчет работы – изменилось бы что-то в вашей
профессиональной жизни, если бы вы научились позитивно себя
оценивать?
ПАЦИЕНТ: Я бы брался за более сложные проекты, пытался както продвинуться.
ТЕРАПЕВТ: И попробовали бы исправить свое финансовое
положение?
ПАЦИЕНТ: Да. Я оплатил бы кредиты и начал бы копить деньги –
это решение действительно было бы умным!

что тоже как ни странно дает неправильный результат.
Вот так вроде ок

(4294967290>>>1) + (4294967290>>>1)

ну потестируйте код автора сами с var и let, и скажите есть там проблемы с производительность в случае let? Я вот потестировал не нашел никаких проблем. Также я вам объяснил почему var лучше не использовать и даже ссылки дал на материалы по этому поводу, а вы даже отвечать не стали. Судя по всему в жизни вы человек крайне не приятный и мне чет стало совсем неприятно с вами общаться. На этом прощаюсь и желаю вам поумнеть и стать добрее.

тут вы правы.
js он реально местами странноватый

4294967290 + 4294967295
8589934585 // переполнения нет
4294967290 >> 1
-3 // переполнение есть

но как оказывается есть специальные битовые операторы о которых я не был в курсе >>> и <<<:

(4294967290 + 4294967290) >>> 1
2147483642

вот автора такого решения я бы наверное взял :)

https://habr.com/ru/companies/ispsystem/articles/779224/#comment_26248196

Хорошее решение на мой взгляд выглядело бы как-то так:

https://habr.com/ru/companies/ispsystem/articles/779224/#comment_26248196


Вот версия для всех случаев, сложность O(log N), точнее кажется O(log2 N) поскольку мы ищем строго первый или последний элемент в массиве в котором значения могут повторяться, в оригнальном алгоритме который автор видимо списал из википедии ищеться первое попавшеся значение, поэтому там действительно O(log N)

// arr: An array that must be sorted in ascending order.
// cmp: A comparator function(a) or a target value. 
//
// The comparator function should be defined to take a single argument 'a'
// and compare it internally:
//    It should return -1 if 'a' is less than a reference value;
//    It should return  0 if 'a' is equal to a reference value;
//    It should return  1 if 'a' is greater than a reference value;
//
// If 'cmp' is not a function, it is treated as a target value against
// which elements of 'arr' are compared.

function createComparator(x) {
	return function(a) {
		if (a < x) {
			return -1;
		}

		if (a > x) {
			return 1;
		}

		return 0;
	}
};

function _getComparator(arg) {
	if (typeof arg === 'function') {
		return arg;
	}

	return createComparator(arg);
}

function findLastIndexEqual(arr, cmp) {
	cmp = _getComparator(cmp);

	let len = arr.length;
	let pos = len >> 1;
	let result = -1;
	let start = 0;

	while (pos >= start && pos < len) {
		if (cmp(arr[pos]) === 0) {
			result = start = pos;
			pos += (len - pos) >> 1 || 1;
		} else if (cmp(arr[pos]) > 0) {
			len = pos;
			pos = start + (((pos - start) >> 1) || pos - 1);
		} else {
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}

function findLastIndexLessOrEqual(arr, cmp) {
	cmp = _getComparator(cmp);

	let len = arr.length;
	let pos = len >> 1;
	let result = -1;
	let start = 0;

	while (pos >= start && pos < len) {
		if (cmp(arr[pos]) <= 0) {
			result = start = pos;
			pos += (len - pos) >> 1 || 1;
		} else {
			len = pos;
			pos = start + (((pos - start) >> 1) || pos - 1);
		}
	}

	return result;
}

function findLastIndexLess(arr, cmp) {
	cmp = _getComparator(cmp);

	let len = arr.length;
	let pos = len >> 1;
	let result = -1;
	let start = 0;

	while (pos >= start && pos < len) {
		if (cmp(arr[pos]) < 0) {
			result = start = pos;
			pos += (len - pos) >> 1 || 1;
		} else {
			len = pos;
			pos = start + (((pos - start) >> 1) || pos - 1);
		}
	}

	return result;
}

function findFirstIndexEqual(arr, cmp) {
	cmp = _getComparator(cmp);

	let len = arr.length;
	let pos = len >> 1;
	let result = -1;
	let start = 0;

	while (pos >= start && pos < len) {
		if (cmp(arr[pos]) === 0) {
			result = pos;
			len = pos;
			pos = start + (((pos - start) >> 1) || pos - 1);
		} else if (cmp(arr[pos]) > 0) {
			len = pos;
			pos = start + (((pos - start) >> 1) || pos - 1);
		} else {
			start = pos;
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}

function findFirstIndexGreaterOrEqual(arr, cmp) {
	cmp = _getComparator(cmp);

	let len = arr.length;
	let pos = len >> 1;
	let result = -1;
	let start = 0;

	while (pos >= start && pos < len) {
		if (cmp(arr[pos]) >= 0) {
			result = pos;
			len = pos;
			pos = start + (((pos - start) >> 1) || pos - 1);
		} else {
			start = pos;
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}

function findFirstIndexGreater(arr, cmp) {
	cmp = _getComparator(cmp);

	let len = arr.length;
	let pos = len >> 1;
	let result = -1;
	let start = 0;

	while (pos >= start && pos < len) {
		if (cmp(arr[pos]) > 0) {
			result = pos;
			len = pos;
			pos = start + (((pos - start) >> 1) || pos - 1);
		} else {
			start = pos;
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}

Если оно O(n), никто не мешает закодить нечто вроде такого, у меня это заняло два часа. Нужно еще два часа потратить чтобы убрать лишние итерации, но мне честно говоря лень. Но факт то что написать бинарный поиск с компараторами это не проблема. Использовать с осторожностью, тестировал каждый кейс на рандомных строках длинной 400 символов со значениям [0..99] и рандомных значениях x в тех же пределах, в качестве эталона использовал простейший перебор, для каждого кейса делал 1 000 000 итераций, вроде ошибок не нашлось.

// Array must be sorted in asending order
// Comparator must return:
//    < 0 if value less than expected;
//      0 if value is equal to excepted
//    > 0 if value is greater than expected

function findLastIndexEqual(arr, cmp) {
	let len = arr.length;
	let pos = len >> 1;
	let result = -1;

	while (pos > -1 && pos < len) {
		if (cmp(arr[pos]) === 0) {
			result = pos;
			pos += (len - pos) >> 1 || 1;
		} else if (cmp(arr[pos]) > 0) {
			len = pos;
			pos = pos >> 1 || pos - 1;
		} else {
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}

function findLastIndexLessOrEqual(arr, cmp) {
	let len = arr.length;
	let pos = len >> 1;
	let result = -1;

	while (pos > -1 && pos < len) {
		if (cmp(arr[pos]) <= 0) {
			result = pos;
			pos += (len - pos) >> 1 || 1;
		} else {
			len = pos;
			pos = pos >> 1 || pos - 1;
		}
	}

	return result;
}

function findLastIndexLess(arr, cmp) {
	let len = arr.length;
	let pos = len >> 1;
	let result = -1;

	while (pos > -1 && pos < len) {
		if (cmp(arr[pos]) < 0) {
			result = pos;
			pos += (len - pos) >> 1 || 1;
		} else {
			len = pos;
			pos = pos >> 1 || pos - 1;
		}
	}

	return result;
}

function findFirstIndexEqual(arr, cmp) {
	let len = arr.length;
	let pos = len >> 1;
	let result = -1;

	while (pos > -1 && pos < len) {
		if (cmp(arr[pos]) === 0) {
			result = pos;
			len = pos;
			pos = pos >> 1 || pos - 1;
		} else if (cmp(arr[pos]) > 0) {
			len = pos;
			pos = pos >> 1 || pos - 1;
		} else {
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}

function findFirstIndexGreaterOrEqual(arr, cmp) {
	let len = arr.length;
	let pos = len >> 1;
	let result = -1;

	while (pos > -1 && pos < len) {
		if (cmp(arr[pos]) >= 0) {
			result = pos;
			len = pos;
			pos = pos >> 1 || pos - 1;
		} else {
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}

function findFirstIndexGreater(arr, cmp) {
	let len = arr.length;
	let pos = len >> 1;
	let result = -1;

	while (pos > -1 && pos < len) {
		if (cmp(arr[pos]) > 0) {
			result = pos;
			len = pos;
			pos = pos >> 1 || pos - 1;
		} else {
			pos += (len - pos) >> 1 || 1;
		}
	}

	return result;
}


function createComparator(x) {
	return function(a) {
		if (a < x) {
			return -1;
		}

		if (a > x) {
			return 1;
		}

		return 0;
	}
};

a = [ 3, 4, 6, 9, 10, 12, 14, 15, 17, 19, 21 ];

console.log(a[findLastIndexLessOrEqual(a, createComparator(12))]);
console.log(a[findLastIndexLessOrEqual(a, createComparator(13))]);
console.log(a[findLastIndexLessOrEqual(a, createComparator(2))]);
console.log(a[findLastIndexLessOrEqual(a, createComparator(22))]);
console.log(a[findLastIndexLessOrEqual(a, createComparator(3))]);
console.log(a[findLastIndexLessOrEqual(a, createComparator(21))]);

прежде всего некорректный здесь вы, потому что выше убеждаете людей что var лучше чем let, потому что в некоторых случаях оно медленнее, чем сразу выдаете в себе дилетанта лол

ну вот вам еще такое решение


function fv4o(a, x) {
    let result = -1;
    let end = (a || []).length;
    let start = 0;
    let pos = end >> 1;

    while (pos < end && result != x) {
        if (a[pos] > x) {
            end = pos;
            pos = ((end - start) >> 1) + start;
            continue;
        }

        result = a[pos];
        start = pos;
        pos = ((end - start) >> 1 || 1) + start;
    }

    return result;
}

}

1
23 ...

Информация

В рейтинге
6 023-й
Откуда
Санкт-Петербург и область, Россия
Зарегистрирован
Активность