реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> "Пятничная" задачка, правда во вторник :)
singlskv
сообщение Mar 31 2009, 17:24
Сообщение #1


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Есть 3 целых числа A,B,C разрядность не принципиальна, но пусть будет байт или uint32.
Допустим что это значения считанные из порта(PIO) в разные моменты времени(типа фильтрация по 3 значениям).
Нужно сформировать из этих 3 чисел 1 число так что бы если в >=2 соответствующих битах 1 то выход 1 иначе 0
те:
Ai = 0 1 1 0
Bi = 0 1 0 1
Ci = 1 0 1 0
-----------------
Ri = 0 1 1 0 <- результат

итд...

нужен самый простой алгоритм...
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 31 2009, 17:38
Сообщение #2



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Обычное мажорирование
Код
R = (A&B) | (A&C) | (B&C);

слегка съэкономленное
Код
R = (A&B) | ((A|B)&C);

дальше не упрощается.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 31 2009, 18:04
Сообщение #3


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(xemul @ Mar 31 2009, 21:38) *
Обычное мажорирование
слегка съэкономленное
Код
R = (A&B) | ((A|B)&C);

дальше не упрощается.
Ну да...
Просто было интересно послушать разные варианты... smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 31 2009, 19:24
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(xemul @ Mar 31 2009, 21:38) *
дальше не упрощается.
Ладно, тогда усложняем, пусть будет 5 чисел A,B,C,D,E
или 7 A,B,C,D,E,F,G...
Go to the top of the page
 
+Quote Post
zzzzzzzz
сообщение Mar 31 2009, 19:35
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 724
Регистрация: 1-05-05
Из: Нью Крыжопыль
Пользователь №: 4 641



Простой алгоритм:
Переписываем числа в другие, состоящие из разрядов исходных, например, первое число : А0, В0, С0, ....
Считаем количество единиц в новых числах. Если больше или равно 2х - то пишем в соответствующий бит результата 1, в противном случае 0.
biggrin.gif biggrin.gif biggrin.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 31 2009, 19:48
Сообщение #6


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zzzzzzzz @ Mar 31 2009, 23:35) *
Простой алгоритм:
biggrin.gif biggrin.gif biggrin.gif
Простой алгоритм ~= экономный алгоритм
Про три числа xemul ответил, интересен вопрос про 5, 7 итд... чисел.
Go to the top of the page
 
+Quote Post
zzzzzzzz
сообщение Mar 31 2009, 19:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 724
Регистрация: 1-05-05
Из: Нью Крыжопыль
Пользователь №: 4 641



Цитата(singlskv @ Mar 31 2009, 23:48) *
Простой алгоритм ~= экономный алгоритм
Про три числа xemul ответил, интересен вопрос про 5, 7 итд... чисел.
Алгоритм не меняется. Считайте до 5 или 7 - какая разница?
Мажоритарная функция для большого количества длинна, а считать, например, сдвигом числа - довольно просто. Дергаешь флагом и все дела...
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 31 2009, 20:01
Сообщение #8


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zzzzzzzz @ Mar 31 2009, 23:55) *
Алгоритм не меняется. Считайте до 5 или 7 - какая разница?
Мажоритарная функция для большого количества длинна, а считать, например, сдвигом числа - довольно просто. Дергаешь флагом и все дела...
дык покажите хотя бы для 3 чисел сдвигом
будет лучше чем: R = (A&B) | ((A|cool.gif&C);
?
Go to the top of the page
 
+Quote Post
zzzzzzzz
сообщение Mar 31 2009, 20:30
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 724
Регистрация: 1-05-05
Из: Нью Крыжопыль
Пользователь №: 4 641



Цитата(singlskv @ Apr 1 2009, 00:01) *
дык покажите хотя бы для 3 чисел сдвигом
будет лучше чем: R = (A&B) | ((A| cool.gif &C);
?
Лень. Пустая трата времени, имхо. Если Вам не влом, выведите мажоритарную функцию для 7 разрядов. И посмотрите на неё пристально biggrin.gif
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 31 2009, 20:46
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



А чё, собственно, экономим-то? Время? Память данных? Длину кода? LUT-ы FPGA? Или запасы воды на МКС?
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 31 2009, 20:52
Сообщение #11


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(zzzzzzzz @ Apr 1 2009, 00:30) *
Лень. Пустая трата времени, имхо. Если Вам не влом, выведите мажоритарную функцию для 7 разрядов. И посмотрите на неё пристально biggrin.gif
Вопрос в том, при каком количестве исходных данных выгодне начинать сдвигать биты а при каком
пользовать AND и OR и хитрые их комбинации.
Более того, существуют варианты например сдвига битов через 1(2,3 итд) через умножение,
и тогда можно просто сложением всех чисел получать готовые ответы на >< на конкретных "знакоместах"




Цитата(SM @ Apr 1 2009, 00:46) *
А чё, собственно, экономим-то? Время? Память данных? Длину кода? LUT-ы FPGA? Или запасы воды на МКС?
Остановимся на "Время?"
Все остальное менее актуально...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 31 2009, 21:51
Сообщение #12


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



1.Накладываем маску из 0b001001001... на каждый операнд (для случая 7-ми переменных)

2. Суммируем их

3. Сдвигаем маску.

Итого число операций N*(log(N)+1), что и следовало ожидать smile.gif
Go to the top of the page
 
+Quote Post
singlskv
сообщение Mar 31 2009, 22:13
Сообщение #13


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(_Pasha @ Apr 1 2009, 01:51) *
1.Накладываем маску из 0b001001001... на каждый операнд (для случая 7-ми переменных)
2. Суммируем их
3. Сдвигаем маску.
Итого число операций N*(log(N)+1), что и следовало ожидать smile.gif
Это так же как вариант с умножением, те проредили биты и сложили.

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

Ну и просто задачка понравилась... smile.gif
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 31 2009, 22:55
Сообщение #14



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Если правильно посчитал, то минимальная дизъюнктивная форма для функции мажорирования из N элементов будет состоять из
N!/((N+1)/2)!/((N-1)/2)!
дизъюнктивных групп по (N+1)/2 элементов в каждой.
Т.е. для 5 элементов получаем 10 дизъюнктивных групп по 3 элемента, для 7 - 35 групп по 4 элемента.
И (умозрительно) на уровне конъюнкций/дизъюнкций особо это дело не упрощается.
Для подсчета количества единиц в каждом "столбце" битов более удобной может оказаться идея "вертикальных счетчиков".
Go to the top of the page
 
+Quote Post
777777
сообщение Apr 1 2009, 04:25
Сообщение #15


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(singlskv @ Mar 31 2009, 21:24) *
Есть 3 целых числа A,B,C разрядность не принципиальна, но пусть будет байт или uint32.
Допустим что это значения считанные из порта(PIO) в разные моменты времени(типа фильтрация по 3 значениям).

Если нужна именно фильтрация, то мажорирование не годится, потому что результат может оказатья неожиданным. Лучше уж отсортировать их и взять то, которое окажется посередине.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 02:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016