Re[7]: min_element в контейнере с известным наименьшем элеме
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 14.09.11 08:51
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:

AP>Если речь о среднем количестве инверсий в перестановке из N элементов, то оно стремится к 1/e, а не 1/2.


К N/e, конечно же.
Re[7]: min_element в контейнере с известным наименьшем элеме
От: slava_phirsov Россия  
Дата: 14.09.11 11:58
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:

Число сравнений ключей в i-м просеивании не больше i-1, как минимум равно 1, и — предполагая, что все перестановки ключей равновероятны, — в среднем равно i/2.


AP>Что такое "Сравнение ключей в i-м просеивании"?


Это число сравнений сортируемых элементов, необходимых для того, чтобы найти позицию вставки i-го элемента в алгоритме простой сортировки вставками. Или число итераций, которое необходимо для нахождения позиции вставки (ибо в каждой итерации осуществляется ровно одно сравнение сортируемых элементов).
Вот, собственно, код (перевожу с Oberon на C):

for (int i = 1; i < N; ++i)
{
  int j = i;
  x = a[i];
  while (j > 0 && x < a[j - 1])
  {
    a[j] = a[j - 1];
    --j;
  }
  a[j] = x;
}


И на i-м шаге цикла for среднее число шагов цикла while будет равно i/2. Согласно выкладкам тов. Вирта.
Теперь сравните этот цикл while с Вашим, и сделайте выводы.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[6]: min_element в контейнере с известным наименьшем элеме
От: uzhas Ниоткуда  
Дата: 14.09.11 12:02
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

_>Здравствуйте, uzhas, Вы писали:


U>>основная проблема с корректным определением вероятностного пространства

_>Про "теорему о динозавре" см. выше.
она неправильно применена, хотя опять же не видно вероятностного пространства

U>>прицепились к какому-то мутному параметру d, который имеет слабое отношение к "среднему кол-ву сравнений в алгоритме"


_>Параметр d здесь, насколько я понимаю, есть просто-напросто длина последовательности. Короче, синоним для того, что по классике принято обозначать буквой N.


все намного сложнее:

К> Iterator last = find_if(begin,end, _1<treshold);
К> return (last!=end) ? last : min_element(begin,end);
....
где d = distance(begin,last)

если бы оперировали N, то цены бы не было всем этим выкладкам =)

_>Вообще же, откровенно говоря, все эти выкладки, приводимые авторами в ветке, меня несколько озадачили.


аналогично
Re[8]: min_element в контейнере с известным наименьшем элеме
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 14.09.11 12:15
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

_>Вот, собственно, код (перевожу с Oberon на C):


_>
_>for (int i = 1; i < N; ++i)
_>{
_>  int j = i;
_>  x = a[i];
_>  while (j > 0 && x < a[j - 1])
_>  {
_>    a[j] = a[j - 1];
_>    --j;
_>  }
_>  a[j] = x;
_>}
_>


_>И на i-м шаге цикла for среднее число шагов цикла while будет равно i/2. Согласно выкладкам тов. Вирта.

_>Теперь сравните этот цикл while с Вашим, и сделайте выводы.

Сравнил. Сделал выводы.
Что Вы нашли общего в этом цикле с min_element_bounded, мне понять тяжело.
На этом месте Николаса из множества "мы с Николой" предлагаю исключить: рассуждения Вирта, разумеется, описывают приведенную сортировку вставками, но не описывают min_element_bounded.

Рискну повториться в третий раз, но среднее количество "дополнительных" сравнений в min_element_bounded равно среднему количеству инверсий в перестановках из N элементов, т.е. N/e.
Оттрассируйте пару конкретных случаев, и Вы убедитесь, что количества сравнений в обоих алгоритмах описываются весьма разными формулами.
Re[5]: min_element в контейнере с известным наименьшем элеме
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 14.09.11 12:19
Оценка: +1
Здравствуйте, uzhas, Вы писали:

_>>"Мы, конечно, в академиях не учились",

U>в этом треде, видимо, никто не соображает в вероятностях
U>основная проблема с корректным определением вероятностного пространства
U>прицепились к какому-то мутному параметру d, который имеет слабое отношение к "среднему кол-ву сравнений в алгоритме"

Вы бы просветили, а то конструктива в Ваших сообщениях в этом топике маловато.
Re[9]: min_element в контейнере с известным наименьшем элеме
От: slava_phirsov Россия  
Дата: 14.09.11 12:37
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:


AP>Сравнил. Сделал выводы.

AP>Что Вы нашли общего в этом цикле с min_element_bounded, мне понять тяжело.

Ну да и ладно. Предлагаю прекратить дискуссию. Dixi.

AP>Оттрассируйте пару конкретных случаев, и Вы убедитесь, что количества сравнений в обоих алгоритмах описываются весьма разными формулами.


А в том-то все и дело, что оттрассировать пару конкретных случаев — недостаточно. Надо усреднить по всем случаям. На то оно и среднее число сравнений.
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[10]: min_element в контейнере с известным наименьшем элем
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 14.09.11 12:41
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

AP>>Оттрассируйте пару конкретных случаев, и Вы убедитесь, что количества сравнений в обоих алгоритмах описываются весьма разными формулами.


_>А в том-то все и дело, что оттрассировать пару конкретных случаев — недостаточно. Надо усреднить по всем случаям. На то оно и среднее число сравнений.


Несложно написать программу, которая это делает (std::next_permutation как основной инструмент).
У меня была, как proof-of-concept, но не сохранилась, новую писать лень.
Re[5]: min_element в контейнере с известным наименьшем элеме
От: slava_phirsov Россия  
Дата: 14.09.11 13:29
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:

_>>
_>>template <class ForwardIterator, class T>
_>>inline
_>>ForwardIterator
_>>min_element_bounded(ForwardIterator first,
_>>                    ForwardIterator last,
_>>                    T const& v)
_>>{
_>>    if (first == last)
_>>        return last;

_>>    ForwardIterator lowest = first;
_>>    if (!(v < *lowest))
_>>        return lowest; // A

_>>    while (++first != last) {
_>>        if (*first < *lowest) {
_>>            lowest = first;
_>>            if (!(v < *lowest))
_>>                return lowest;
_>>        }
_>>    }
_>>    return lowest;
_>>}
_>>



AP>Ошибка выделена. Среднее количество "доволнительных" (выделены в коде) сравнений равно среднему количеству инверсий в перестановке, т.е. N/e.


Мда, прозевал. Бывает
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[5]: min_element в контейнере с известным наименьшем элеме
От: slava_phirsov Россия  
Дата: 14.09.11 13:35
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:

AP>Ошибка выделена. Среднее количество "доволнительных" (выделены в коде) сравнений равно среднему количеству инверсий в перестановке, т.е. N/e.


Грубо говоря, имеем среднее количество сравнений (N / e + N / 2) = чуть меньше N. Лучше, чем std::min_element. Но не сильно. Или нет?
Люди! Люди, смотрите, я сошел с ума! Люди! Возлюбите друг друга! (вы чувствуете, какой бред?)
Re[6]: min_element в контейнере с известным наименьшем элеме
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 14.09.11 13:52
Оценка:
Здравствуйте, slava_phirsov, Вы писали:

AP>>Ошибка выделена. Среднее количество "доволнительных" (выделены в коде) сравнений равно среднему количеству инверсий в перестановке, т.е. N/e.


_>Грубо говоря, имеем среднее количество сравнений (N / e + N / 2) = чуть меньше N. Лучше, чем std::min_element. Но не сильно. Или нет?


Зависит от природы распределения элементов в контейнере, на самом деле.
Может быть сильно лучше; почти также; и даже несколько хуже.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.