2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Поиск k максимальных элементов в столбце матрицы
Сообщение27.10.2006, 05:18 


15/11/05
46
Томск
Кто-нибудь занимался решением такой задачи?
Как лучше реализовать на С/С++-?
Размер матрицы может быть большой а эти самые k максимальные элементы могут быть в небольшом количестве, поэтому команды типа Sort(последовательности) несовсем, по моему, подходят.....

 Профиль  
                  
 
 
Сообщение27.10.2006, 06:58 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
Можно завести массив (или даже лучше список) длины $k$. Первые $k$ элементов столбца класть в него с сортировкой. Пройти по столбцу, каждый новый элемент сравнивать с минимальным из имеющихся. Если он меньше, то пропускать, иначе докладывать в массив, выкидывая из него наименьший.

 Профиль  
                  
 
 
Сообщение27.10.2006, 10:14 


15/11/05
46
Томск
значит все таки список....
я думал немного по другому....
брать столбец копировать в список...потом после нахождения максимального его вырезать из списка....

 Профиль  
                  
 
 
Сообщение27.10.2006, 11:40 
Супермодератор
Аватара пользователя


29/07/05
8248
Москва
KSergP писал(а):
значит все таки список....
я думал немного по другому....
брать столбец копировать в список...потом после нахождения максимального его вырезать из списка....


Ну это явно не оптимально, практически то же, что сортировка всего столбца.

 Профиль  
                  
 
 
Сообщение27.10.2006, 18:02 


12/10/06
56
задача легко решается за линейное время.


Находим за линейное время Н-к порядковую статистику, где Н количество элементов в строке


Дальше тривиально находим за линейное время все элементы большие найденной статистики

 Профиль  
                  
 
 
Сообщение27.10.2006, 18:50 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
esperanto писал(а):
Находим за линейное время Н-к порядковую статистику, где Н количество элементов в строке

Не поясните, а как Вы это делаете? (задача о голандском флаге?)

 Профиль  
                  
 
 
Сообщение27.10.2006, 19:33 


12/10/06
56
незваный гость писал(а):
:evil:
esperanto писал(а):
Находим за линейное время Н-к порядковую статистику, где Н количество элементов в строке

Не поясните, а как Вы это делаете? (задача о голандском флаге?)


Да, пожалуйста.

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


Первый метод, не прост(относительно) И описывается в книги Риверста.

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

f(n,arr)
y=random element of arr.
s=sum of elemenits of arr wich<y
if s=n return s
if s<n then return f(n-s,element of arr wich great then y)
if s>n then retutn f(n,elements of arr wivh less then y
end f

 Профиль  
                  
 
 
Сообщение28.10.2006, 09:47 
Заслуженный участник


15/05/05
3445
USA
2 esperanto
В худшем случае, когда на первом (вероятностном) шаге всегда выбирается максимальный или минимальный элемент, количество сравнений в вероятностном алгоритме будет равно $\frac{n(n-1)}{2}$. Вполне возможно, что в среднем сложность алгоритма - порядка n^{1+\delta}$, где $\delta < 1$. Но скорее всего все равно $\delta > 0$, т.е. алгоритм - не линейный по сложности.

Относительно основного вопроса: IMHО алгоритм, который предложил PAV, - наилучший и простейший при $k \ll n$. А вот если $k \backsim n$, то этот алгоритм по порядку сложности будет примерно эквивалентен сортировке.

 Профиль  
                  
 
 
Сообщение28.10.2006, 11:25 


12/10/06
56
Yuri Gendelman писал(а):
2 esperanto
В худшем случае, когда на первом (вероятностном) шаге всегда выбирается максимальный или минимальный элемент, количество сравнений в вероятностном алгоритме будет равно $\frac{n(n-1)}{2}$. Вполне возможно, что в среднем сложность алгоритма - порядка n^{1+\delta}$, где $\delta < 1$. Но скорее всего все равно $\delta > 0$, т.е. алгоритм - не линейный по сложности.

Относительно основного вопроса: IMHО алгоритм, который предложил PAV, - наилучший и простейший при $k \ll n$. А вот если $k \backsim n$, то этот алгоритм по порядку сложности будет примерно эквивалентен сортировке.


ЕЩе раз. Вероятность того что алгоритм, не будет линейным порядка 2^(-n), когда п - размер массива.

Уже для массива размера 100, эта вероятность незначима.

Есть разнича между алгоритмами ошибающимися на 10% входных данных и ошибающимися с вероятностью 10% на любой вход.

Вообщем алгоритм линейный с вероятностью 1-2^(-n)

Добавлено спустя 54 секунды:

А на практике алгоритм часто работает быстрей невероятностого алгоритма.

 Профиль  
                  
 
 
Сообщение28.10.2006, 17:39 
Заслуженный участник


15/05/05
3445
USA
esperanto писал(а):
ЕЩе раз. Вероятность того что алгоритм, не будет линейным порядка 2^(-n), когда п - размер массива.

Алгоритм, время работы которого линейно почти всегда, принято так и называть: "алгоритмом с линейной почти всегда сложностью".
Происхождение Вашей оценки ($2^{-n}$) мне не понятно. Вы хотите сказать, что время работы этого алгоритма линейно по времени для всех возможных последовательностей, кроме одной? Но это не так. На каждом из n-1 шагов возможны как минимум ДВА разных и одинаково неудачных выбора (максимум и минимум).

esperanto писал(а):
Есть разнича между алгоритмами ошибающимися на 10% входных данных и ошибающимися с вероятностью 10% на любой вход.

Для пользователя, если все входы равновероятны, разницы нет: вероятность ошибки равна 10%. Если возможные входы НЕ равновероятны, то 1-й алгоритм может быть как лучше, так и хуже 2-го.

 Профиль  
                  
 
 
Сообщение28.10.2006, 19:21 


12/10/06
56
Yuri Gendelman писал(а):
esperanto писал(а):
ЕЩе раз. Вероятность того что алгоритм, не будет линейным порядка 2^(-n), когда п - размер массива.

Алгоритм, время работы которого линейно почти всегда, принято так и называть: "алгоритмом с линейной почти всегда сложностью".
Происхождение Вашей оценки ($2^{-n}$) мне не понятно. Вы хотите сказать, что время работы этого алгоритма линейно по времени для всех возможных последовательностей, кроме одной? Но это не так. На каждом из n-1 шагов возможны как минимум ДВА разных и одинаково неудачных выбора (максимум и минимум).

esperanto писал(а):
Есть разнича между алгоритмами ошибающимися на 10% входных данных и ошибающимися с вероятностью 10% на любой вход.

Для пользователя, если все входы равновероятны, разницы нет: вероятность ошибки равна 10%. Если возможные входы НЕ равновероятны, то 1-й алгоритм может быть как лучше, так и хуже 2-го.


По-поводу первого вашего вопроса, разумеется я имел ввиду вероятность ошибки, в о-нотации.
2^(-tetta(n))
По-поводу последнего замечания вы не правы. Вот представте себе вы староста и заказываете врача в деревню.

Врач, первого типа не вылечит 10% больных и они умрут.

Врач второго типа, сможет оказать повторную помощь тем больным которых он не вылечил и уже в среднем 1\100 людей останется не вылечеными.

 Профиль  
                  
 
 
Сообщение28.10.2006, 20:32 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Оценка метода PAV, по-моему, ${\rm O}(k \log k + (n-k) (\log k + k/2) )$. При малых $k$ может считаться линейной, при больших — (доля $n$) — уже нет. Впричем, алгоритм PAV можно слегка реорганизовать, заменив сортированную часть массива (длиной $k$) пирамидой (кучей, heap). Тогда оценка меняется до ${\rm O}(n \log k)$.

Впрочем, в STL входит алгоритм построения кучи за линейное время. (Я не уверен, что авторы текста имеют в виду, не разбирался.) Если так, то строим кучу за ${\rm O}(n)$ и вынимаем из нее $k$ элементов за ${\rm O}(k \log n)$.

 Профиль  
                  
 
 
Сообщение28.10.2006, 21:52 


12/10/06
56
незваный гость писал(а):
:evil:
Оценка метода PAV, по-моему, ${\rm O}(k \log k + (n-k) (\log k + k/2) )$. При малых $k$ может считаться линейной, при больших — (доля $n$) — уже нет. Впричем, алгоритм PAV можно слегка реорганизовать, заменив сортированную часть массива (длиной $k$) пирамидой (кучей, heap). Тогда оценка меняется до ${\rm O}(n \log k)$.

Впрочем, в STL входит алгоритм построения кучи за линейное время. (Я не уверен, что авторы текста имеют в виду, не разбирался.) Если так, то строим кучу за ${\rm O}(n)$ и вынимаем из нее $k$ элементов за ${\rm O}(k \log n)$.


Авторы имеют в виду алгоритм сложности tetta(n)

 Профиль  
                  
 
 
Сообщение28.10.2006, 22:14 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
esperanto писал(а):
Авторы имеют в виду алгоритм сложности tetta(n)

А что это за зверь — tetta? Если это $\Theta$, то в чем разница между ${\rm O}(n)$ и $\Theta(n)$ (мне казалось, они взаимозаменяемы)?

 Профиль  
                  
 
 
Сообщение28.10.2006, 22:55 


12/10/06
56
незваный гость писал(а):
:evil:
esperanto писал(а):
Авторы имеют в виду алгоритм сложности tetta(n)

А что это за зверь — tetta? Если это $\Theta$, то в чем разница между ${\rm O}(n)$ и $\Theta(n)$ (мне казалось, они взаимозаменяемы)?


Как раз завтра это рассказываю студентам.

${\rm f(x)=O}(g(x))$ если существует с -постоянная большая ноля такая что :
f(x)<cg(X) для любого целого положительного х.

${\rm f(x)=$\Theta}(g(x))$ если существуют с,м -постоянные большая ноля такия что :
mg(x)<f(x)<cg(X) для любого целого положительного х.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group