а, так я то писал что задача как раз в том чтобы избавиться от цикла поиска максимума. Так то оно быстрее если ядра есть лишние и бесплатные. В моем случае такой халявы не было :)
так в этом собственно и суть. 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, результат тот же самый, только в разы медленнее.
И так, сознание представляет собой развитый активный гиперграф с пятью (пока) механизмами которые могут иметь различную степень развитости: механизм Интерпретатор, система подкрепления, чувство собственного тела, абстрактное мышление, речь.
Довольно странная формулировка получилась. А что, без речи сознания быть не может? А без абстрактного мышления? А так ли необходим ли интерпретатор? Возможно сознание может быть и без интерпретатора, речи и абстрактоного мышления но другое?
я прочитал и понял так, что нет и не может быть доказательств, что психоанализ или КПТ работает, но психоанализ обычно сильно дольше и дороже. Если вы разбираетесь в теме, не могли бы вы объяснить простыми словами как именно психоанализ работает? Насколько я понимаю, он полезен в случаях когда проблемы вызваны какой-то ситуацией в прошлом (травмой), о которой пациент как бы даже не знает или не помнит и в таком случае метод свободных ассоциаций или анализа сновидений может действительно привести к некому инсайту (причем не обязательно правдивому), который поможет человеку избавиться от нежелательных паттернов или схем. В таком случае (когда травма далеко в прошлом и пациент ее не помнит и не замечает) кажется, КПТ действительно врядли поможет, а психоанализ скорее да. Исходя из того что вы написали я бы предположил что начинать надо именно с КПТ, и если проблема лежит глубже, то тогда уже искать психоаналитика, он может поможет, а может и нет, гарантии никакой нет.
Я сейчас читаю Роберта Лихи - Техники когнитивной психотерапии, и суть там в том чтобы найти устоявшиеся нерациональные схемы поведения и мышления которые мешают жить, вкладывая в депрессию или тревожность и изменить их, показав что можно думать иначе, прежде всего с помощью рациональности, а никаким образом не оправдывая их. Возьмем ситуацию описанную автором, где человек боится неудач потому что учитель вызывал его к доске и он не смог ответить и все смеялись. В таком случае пациенту предлагается осознать эту устоявшуюся схему и ее изменить и предлагаются методики как это сделать, чтобы человек понял что он вовсе не лузер, а наоборот что он смог получить диплом, у него есть работа с которой он справляется и т.д. и на самом деле он никакой не неудачник. А то что рассказывает автор, когда вместо исправления схемы создается другая схема, которая оправдывает его за счет его негативного опыта в прошлом, ну это как бы чушь собачья, нормальный терапевт такого делать не будет, это полностью противоречит современным подходам. Т.Е. нужно все таки различать самозванцев которых разумеется среди психотерапевтов не мало, и нормальных, годных, психотерапевтов, которые действительно учат мыслить рационально и исправляют неправильные паттерны мышления и поведения. Поскольку автор статьи ничего про это не рассказал, я бы не стал доверять его мнению, а вместо это рекомендовал бы почитать нормальные книжки (того же Роберта Лихи) про современные методы психотерапии, прежде всего КПТ, чтобы хотя бы понимать что такое современные подходы в психотерапии.
Пример из книги, он конечно примитивин до нельзя, но хорошо показывает используемые методы:
ТЕРАПЕВТ: Вы считаете себя глупым и безответственным, потому что именно так воспринимал вас ваш отец. А как вы думаете, какой могла бы быть ваша новая, более позитивная схема? ПАЦИЕНТ: Что я умный, нормальный парень. ТЕРАПЕВТ: Хорошо. И какие доказательства тому, что вы умный, можно было бы найти? ПАЦИЕНТ: Я окончил университет, получил степень магистра, неплохо справляюсь с работой. У меня высокий IQ. ТЕРАПЕВТ: А если бы вы считали себя умным, какие мысли возникали бы у вас при знакомстве с новыми людьми? ПАЦИЕНТ: Я бы думал, что они увидят, какой я сообразительный. ТЕРАПЕВТ: А как насчет работы – изменилось бы что-то в вашей профессиональной жизни, если бы вы научились позитивно себя оценивать? ПАЦИЕНТ: Я бы брался за более сложные проекты, пытался както продвинуться. ТЕРАПЕВТ: И попробовали бы исправить свое финансовое положение? ПАЦИЕНТ: Да. Я оплатил бы кредиты и начал бы копить деньги – это решение действительно было бы умным!
ну потестируйте код автора сами с var и let, и скажите есть там проблемы с производительность в случае let? Я вот потестировал не нашел никаких проблем. Также я вам объяснил почему var лучше не использовать и даже ссылки дал на материалы по этому поводу, а вы даже отвечать не стали. Судя по всему в жизни вы человек крайне не приятный и мне чет стало совсем неприятно с вами общаться. На этом прощаюсь и желаю вам поумнеть и стать добрее.
Вот версия для всех случаев, сложность 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;
}
а, так я то писал что задача как раз в том чтобы избавиться от цикла поиска максимума. Так то оно быстрее если ядра есть лишние и бесплатные. В моем случае такой халявы не было :)
так в этом собственно и суть.
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гб данных не нужно было хранить все данные памяти, а обрабатывать чанками.
del.
мало желающих. давал в качестве собеса несколько раз. Один чел начал двигаться в правильном направлении, но там быстро не решить ее если первый раз видишь. Я когда с ней столкнулся, несколько дней потратил пока нашел способ оптимизации и пару дней еще на отладку и тестирование.
собственно если кому интересно то вот:
проблема этой функции в том что нужно две итерации.
первая чтобы найти максимум, вторая чтобы получить результат.
нужно сделать так чтобы была только одна итерация, т.е. убрать sort в начале.
Похоже что так. у меня есть хитрая задача по оптимизации которой нет в инете, я на ней тестирую LLM. Пока ни одна даже близко не приблизилась к решению. Сейчас проверил на o1-preview, результат тот же самый, только в разы медленнее.
И так, сознание представляет собой развитый активный гиперграф с пятью (пока) механизмами которые могут иметь различную степень развитости: механизм Интерпретатор, система подкрепления, чувство собственного тела, абстрактное мышление, речь.
Довольно странная формулировка получилась. А что, без речи сознания быть не может? А без абстрактного мышления? А так ли необходим ли интерпретатор? Возможно сознание может быть и без интерпретатора, речи и абстрактоного мышления но другое?
а как быть например с Исландией где используются не только patronymic но и matronymic names?
я прочитал и понял так, что нет и не может быть доказательств, что психоанализ или КПТ работает, но психоанализ обычно сильно дольше и дороже. Если вы разбираетесь в теме, не могли бы вы объяснить простыми словами как именно психоанализ работает? Насколько я понимаю, он полезен в случаях когда проблемы вызваны какой-то ситуацией в прошлом (травмой), о которой пациент как бы даже не знает или не помнит и в таком случае метод свободных ассоциаций или анализа сновидений может действительно привести к некому инсайту (причем не обязательно правдивому), который поможет человеку избавиться от нежелательных паттернов или схем. В таком случае (когда травма далеко в прошлом и пациент ее не помнит и не замечает) кажется, КПТ действительно врядли поможет, а психоанализ скорее да. Исходя из того что вы написали я бы предположил что начинать надо именно с КПТ, и если проблема лежит глубже, то тогда уже искать психоаналитика, он может поможет, а может и нет, гарантии никакой нет.
и еще вот была на хабре хорошая статья про то что не так в России с психологами https://habr.com/ru/articles/517062/
Я сейчас читаю Роберта Лихи - Техники когнитивной психотерапии, и суть там в том чтобы найти устоявшиеся нерациональные схемы поведения и мышления которые мешают жить, вкладывая в депрессию или тревожность и изменить их, показав что можно думать иначе, прежде всего с помощью рациональности, а никаким образом не оправдывая их. Возьмем ситуацию описанную автором, где человек боится неудач потому что учитель вызывал его к доске и он не смог ответить и все смеялись. В таком случае пациенту предлагается осознать эту устоявшуюся схему и ее изменить и предлагаются методики как это сделать, чтобы человек понял что он вовсе не лузер, а наоборот что он смог получить диплом, у него есть работа с которой он справляется и т.д. и на самом деле он никакой не неудачник. А то что рассказывает автор, когда вместо исправления схемы создается другая схема, которая оправдывает его за счет его негативного опыта в прошлом, ну это как бы чушь собачья, нормальный терапевт такого делать не будет, это полностью противоречит современным подходам. Т.Е. нужно все таки различать самозванцев которых разумеется среди психотерапевтов не мало, и нормальных, годных, психотерапевтов, которые действительно учат мыслить рационально и исправляют неправильные паттерны мышления и поведения. Поскольку автор статьи ничего про это не рассказал, я бы не стал доверять его мнению, а вместо это рекомендовал бы почитать нормальные книжки (того же Роберта Лихи) про современные методы психотерапии, прежде всего КПТ, чтобы хотя бы понимать что такое современные подходы в психотерапии.
Пример из книги, он конечно примитивин до нельзя, но хорошо показывает используемые методы:
ТЕРАПЕВТ: Вы считаете себя глупым и безответственным,
потому что именно так воспринимал вас ваш отец. А как вы думаете,
какой могла бы быть ваша новая, более позитивная схема?
ПАЦИЕНТ: Что я умный, нормальный парень.
ТЕРАПЕВТ: Хорошо. И какие доказательства тому, что вы умный,
можно было бы найти?
ПАЦИЕНТ: Я окончил университет, получил степень магистра,
неплохо справляюсь с работой. У меня высокий IQ.
ТЕРАПЕВТ: А если бы вы считали себя умным, какие мысли
возникали бы у вас при знакомстве с новыми людьми?
ПАЦИЕНТ: Я бы думал, что они увидят, какой я сообразительный.
ТЕРАПЕВТ: А как насчет работы – изменилось бы что-то в вашей
профессиональной жизни, если бы вы научились позитивно себя
оценивать?
ПАЦИЕНТ: Я бы брался за более сложные проекты, пытался както продвинуться.
ТЕРАПЕВТ: И попробовали бы исправить свое финансовое
положение?
ПАЦИЕНТ: Да. Я оплатил бы кредиты и начал бы копить деньги –
это решение действительно было бы умным!
что тоже как ни странно дает неправильный результат.
Вот так вроде ок
ну потестируйте код автора сами с var и let, и скажите есть там проблемы с производительность в случае let? Я вот потестировал не нашел никаких проблем. Также я вам объяснил почему var лучше не использовать и даже ссылки дал на материалы по этому поводу, а вы даже отвечать не стали. Судя по всему в жизни вы человек крайне не приятный и мне чет стало совсем неприятно с вами общаться. На этом прощаюсь и желаю вам поумнеть и стать добрее.
тут вы правы.
js он реально местами странноватый
но как оказывается есть специальные битовые операторы о которых я не был в курсе >>> и <<<:
вот автора такого решения я бы наверное взял :)
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)
Если оно O(n), никто не мешает закодить нечто вроде такого, у меня это заняло два часа. Нужно еще два часа потратить чтобы убрать лишние итерации, но мне честно говоря лень. Но факт то что написать бинарный поиск с компараторами это не проблема. Использовать с осторожностью, тестировал каждый кейс на рандомных строках длинной 400 символов со значениям [0..99] и рандомных значениях x в тех же пределах, в качестве эталона использовал простейший перебор, для каждого кейса делал 1 000 000 итераций, вроде ошибок не нашлось.
прежде всего некорректный здесь вы, потому что выше убеждаете людей что var лучше чем let, потому что в некоторых случаях оно медленнее, чем сразу выдаете в себе дилетанта лол
ну вот вам еще такое решение
}