|
|
|
| Делаю голосование за фотографии. Не могу придумать разумный алгоритм!
Идея в следующем... фотография, под ней 5 ссылок: "1 2 3 4 5" это количество баллов которые пользователь может отдать за фотографию. Чуть выше 5 звездочек, это результаты голосования. Сколько звездочек "подсвечено" столько голосов отдали больше за фотографию.
У меня есть два решения:
1. Записывать голоса в таблицу с фотографией в отдельное текстовое поле voices следующим образом: Если поставили оценку 5 добавлять к полю voices 5. Для подсвечивания результатов голосования искать повторения в строке... каких повторений больше, столько и звездочек ставить....
2. Записывать голоса в отдельную таблицу... с id фотографии и отданным голосом... Затем sql запросами выяснить каких оценок было поставлено больше, столько звездочек и подсветить.
Какой из этих двух вариантов разумнее? Существует ли какой - то третий вариант?
И сразу возникает вопрос, как сравнить переменные и определить из них большую по значению?
Буду искренне благодарен за помощь :) | |
|
|
|
|
|
|
|
для: Job
(16.12.2008 в 23:50)
| | Нужно учитывать, что голос это свойство не только фотографии, но и автора оценки.
Впрочем, если отдельные голоса не хранить, можно пойти и по первому пути.
Тут нужно оценить насколько велико будет множество фотографий, посетителей и отдельных голосов.
Если не пугает - лучше выбрать второй вариант.
>И сразу возникает вопрос, как сравнить переменные и определить из них большую по значению?
А как вы делаете это без компьютера? | |
|
|
|
|
|
|
|
для: Job
(16.12.2008 в 23:50)
| | > каких повторений больше, столько и звездочек ставить
> выяснить каких оценок было поставлено больше, столько звездочек и подсветит
* Приходит в гнев * При оценках "1, 1, 2, 3, 5" Вы что поставите в итоге? 1? | |
|
|
|
|
|
|
|
для: BinLaden
(17.12.2008 в 00:10)
| | В таких случаях используется медиана, но для ее расчёта придётся хранить также список всех голосов. | |
|
|
|
|
|
|
|
для: valenok
(17.12.2008 в 03:12)
| | Ноу комментс | |
|
|
|
|
|
|
|
для: BinLaden
(17.12.2008 в 03:45)
| | а среднее арифметическое чем вас не устраивает? зачем так все сложно делать, есть целая наука - мат статистика, она (наука) уже все уже решила.
В базе можно вообще хранить только 2 значения, средне арифметическое значение (САЗ.) и количество проголосовавших (КП) (по умолчанию необходимо записать в них значение 0 в оба)
После того как человек ответил Вы достаете из базы САЗ (для первого равно 0) умножайте на КП (для первого равно 0) прибавляете значение которое ввел автор, к КП прибавляете 1 (единицу) и делите полученную сумму увеличенное на КП. Получаете новое САЗ, новые значения записываете в базу.
Вот так это примерно будет выглядеть на пхп
<?
//Примем:
//$srsumm-средняя оценка - САЗ (для первого значения должно быть 0)
//$sr -количество проголосовавших - КП (для первого значения должно быть 0)
//$s- оценка которую поставил автор.
$srsumm=$srsumm*$sr;
$sr++;
$srsumm=$srsumm+$s;
$srsumm=$srsumm/$sr;
//$srsumm - получаем новое среднеарифметическое
//$sr - тоже новое увеличенное на 1;
?>
|
Тут могут начаться подводные камни, надо учесть, что полученное число будет в дробном виде, и округлять его я не советую, т.к. начнутся проблемы с точностью, поэтому рекомендую хранить значение в дробном виде, а округлять при выводе на экран. | |
|
|
|
|
|
|
|
для: lifead
(17.12.2008 в 10:06)
| | Проблемка еще в том что нужно определять голосовал ли данный человек, за данную фотку.
Да просто создай табличку и пихай туда голосования за фотки, перед запихиванием проверяй не голосовал ли уже пользователь с таким ID (если это нужно конечно), а то накрутка однако вещь неблагодарная...
примерная структура таблички:
ID | FID (ID фото) | UID (ID пользователя) | BALL (Оценка)
|
для быстроты вывода статистики можно в табличку фоток добавить поля САЗ и КП как советовал lifead и обновлять их как только пользюк проголосовал | |
|
|
|
|
|
|
|
для: lifead
(17.12.2008 в 10:06)
| | > lifead (17.12.2008 в 10:06)
> для: BinLaden (17.12.2008 в 03:45)
> а среднее арифметическое чем вас не устраивает?
Вы ошибились: этот вопрос нужно задавать автору темы, а не мне. | |
|
|
|
|
|
|
|
для: BinLaden
(17.12.2008 в 03:45)
| | В фоторейтинге мне поставили низкую оценку, это как-то влияет на рейтинг?
При расчете рейтинга используется не среднее арифметическое значение, а медиана, которая не так чувствительна к отклонениям оценок (как в большую, так и в меньшую сторону). Вот пример. Для простоты позьмем оценки по одному из критериев. К примеру, фото получило следующие оценки: 8, 7, 7, 7, 7, 8, 5, 9, 7. Значение среднего арифметического = (8+7+7+7+7+8+5+9+7)/9 = 7.22. Медиана вычисляется следующим образом: расположим оценки по возрастанию от самой низкой к самой высокой и возьмем средний элемент: 5, 7, 7, 7, 7, 7, 8, 8, 9. Медиана = 7. Теперь фото получило оценку 1. Среднее арифметическое равно (8+7+7+7+7+8+5+9+7+1)/10 = 6.6. А медиана: 1, 5, 7, 7, 7, 7, 7, 8, 8, 9, она все равно осталась = 7. Если бы фото получило оценку 10, то медиана все равно осталась бы равна 7. А вот если бы фото получило несколько высоких или низких оценок, то медиана в данном случае изменилась бы скачкообразно. Таким образом медиана малочувствительна к крайним значениям оценок (в отличие от среднего арифметического) и рейтинг, вычисляемый на основе медианы также малочувствителен к выбросам как в большую, так и в меньшую сторону. Поэтому не стоит волноваться при получении одной-двух крайне низких оценок (равно как и радоваться при получении крайне высоких) - эти оценки наверняка не окажут никакого влияния на значение рейтинга в том случае, если остальные оценки лежат в другом диапазоне. | |
|
|
|
|
|
|
|
для: Valick
(17.12.2008 в 12:04)
| | Да, Медиана прикольная штука... но я всётаки остановлюсь на предложении о среднем арифметическом значении... Спасибо вам всем за помошь!!!! ))) Никогда бы недадумался наверно без вас )) Лучший форум! +1 )) | |
|
|
|