AKB Forums

Go Back   AKB Forums > Technical sections > Algorithms
Home Register Blogs FAQ Members List Calendar Downloads Arcade Mark Forums Read

Algorithms The source of algorithms for your project

Troubles when posting message? Click here! :: Проблемы с отправлением сообщения? Нажмите сюда!

Reply
 
LinkBack Thread Tools Display Modes
Old Jul 30, 2005, 08:30   #1
джаз-оркестр
 
Hrach_Techie's Avatar
 
Join Date: Aug 2004
Location: америка
Posts: 16,224
Rep Power: 7
Reputation: 296
Question Explain please ...

чят б/п

how's storing the result works here? it's not homework or any kind of assignment or so - just curious how it works ...
__________________

Hrach_Techie is offline   Reply With Quote Quote selected
Old Jul 30, 2005, 19:58   #2
Авик
 
CyberJoe's Avatar
 
Join Date: Jul 2002
Location: Yerevan
Posts: 1,347
Rep Power: 6
Reputation: 19
Send a message via ICQ to CyberJoe
Первая функция проверяет сколько ваз value повторяеться в массиве Array.
Вторая возвращает значение переменно из массива которая повторяеться чаще всех.

Вродеб.
__________________
вот собственно все, что я хотел сказать.
CyberJoe is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 09:03   #3
Дикообраз-безобраз
 
AvDav's Avatar
 
Join Date: Jul 2004
Location: У самого синего моря
Posts: 2,508
Rep Power: 4
Reputation: 44
Send a message via ICQ to AvDav
медленнее, но короче
Code:
#include <map>
#include <algorithm>

int get_max_freq_el(int *firstCell, int sz)
{
    using namespace std;
    map<int, int, greater<int> > counts;
    int n=sz<<1;
    for(int i=0; i<n; counts[count(firstCell, firstCell+n, firstCell[i])]=firstCell[i], ++i);
    return counts.begin()->second;
}
__________________
Forza Alb-Violeţii.
AvDav is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 09:17   #4
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,111
Rep Power: 6
Reputation: 10
Send a message via ICQ to nm
Quote:
Originally Posted by AvDav
медленнее, но короче
Code:
#include <map>
#include <algorithm>

int get_max_freq_el(int *firstCell, int sz)
{
    using namespace std;
    map<int, int, greater<int> > counts;
    int n=sz<<1;
    for(int i=0; i<n; counts[count(firstCell, firstCell+n, firstCell[i])]=firstCell[i], ++i);
    return counts.begin()->second;
}

замечу, что еще непонятнее и неправильнее (кстати )
nm is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 09:30   #5
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,111
Rep Power: 6
Reputation: 10
Send a message via ICQ to nm
2Hrach - есть 3 варианта решения такой задачи -
1. сделать ассоциативный массив (int) -> (count) т.е. хранящий сколько раз данный инт встречается , после чего найти max от значений count, и соответствующий ему int
2. сделать как в твоем куске кода - один цикл идет по массиву, другой считает сколько раз встречается данный элемент в массиве - крайне нееффективный способ, т.к. O(N^2) операций. как пример приведу массив
[1,1,1,1,1,1,1,1,1,1,1,2,1] подумай, сколько раз функция appearance фудет высчитывать не нужное одно и то же значение для 1
3. если есть возможность копировать весь массив данных - то самый быстрый способ -- взять весь массив, отсортировать, далее в 1 проход определить последовательность каких чисел длиннее.

метод 1 - может быть крайне эффективным при том примере, который я привел - т.е. он будет хранить ровно 2 елемента, но при массиве типа [1,2,3,4,5,6,7,8,9,10,11,12,1] - он будет давать огромный overhead в использовании памяти - т.к. каждый элемент будет еще иметь с собой ссылки на другие элементы массива - т.е. эффективность будет от O(n) до O(log n) - если у тебя хватит памяти
метод 2 - квадратная зависимость от размера массива, т.е. для массива в 1000 элелемтов будет выполнено лимончик операций
метод 3 - дает постоянное (предсказуемое) использование памяти и количество операций O(n*log(n))

и ваще - можно почитать http://yenigul.net/tpop/handouts/C_Algorithms.htm просто для сравнения

мое личное предпочтение - number three - princessa Fion^W^W^W^W^W ну последний алгоритм
nm is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 11:15   #6
Дикообраз-безобраз
 
AvDav's Avatar
 
Join Date: Jul 2004
Location: У самого синего моря
Posts: 2,508
Rep Power: 4
Reputation: 44
Send a message via ICQ to AvDav
Quote:
Originally Posted by nm
замечу, что еще непонятнее и неправильнее (кстати )
почему неправильнее? считает количества вхождений для каждого элемента, если 2 или более максов даст последний макс, ну или так:
Code:
int get_max_freq_el(int* firstCell, int sz)
{
 using namespace std;
 hash_map<int, int> cc;
 int n=sz<<1;
 for(int i=0; i<n; ++cc[firstCell[i]], ++i);
 hash_map<int, int>::iterator i=cc.begin(), mit=i;
 while(i++!=cc.end()) if(mit->second < i->second) mit=i;
 return mit->first;
}
__________________
Forza Alb-Violeţii.
AvDav is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 11:31   #7
Авик
 
CyberJoe's Avatar
 
Join Date: Jul 2002
Location: Yerevan
Posts: 1,347
Rep Power: 6
Reputation: 19
Send a message via ICQ to CyberJoe
Не, ну можно по короче, но не оптимальнее.
За корректность кода не отвечаю, нет компилятора, а так алгоритм, прост и короток. только вот работает с маленькими эллементами массива, т.е числа не должны сильно превышать какой то лимит.
Зато скорость большая даже если в массиве оооочень много эллементов.

Code:
int getmax(int * arr, int c){
int max = arr[0];
for (int i = 0; i < c; i++) if (max < arr[i]) max = arr[i];
return max;
}

int func(int * arr,int c){
int p = getmax(arr,c);
int *arr2; arr2 = new int[p];
for (int i = 0; i < c; i++) arr2[arr[i]]++;
p=getmax(arr2,p);
return p;
}
__________________
вот собственно все, что я хотел сказать.
CyberJoe is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 12:28   #8
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,111
Rep Power: 6
Reputation: 10
Send a message via ICQ to nm
Quote:
Originally Posted by AvDav
почему неправильнее? считает количества вхождений для каждого элемента, если 2 или более максов даст последний макс, ну или так:
Code:
int get_max_freq_el(int* firstCell, int sz)
{
 using namespace std;
 hash_map<int, int> cc;
 int n=sz<<1;
 for(int i=0; i<n; ++cc[firstCell[i]], ++i);
 hash_map<int, int>::iterator i=cc.begin(), mit=i;
 while(i++!=cc.end()) if(mit->second < i->second) mit=i;
 return mit->first;
}
int n=sz<<1;

size*size rawno size*2 tol'ko w chastnom sluchae )))
nm is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 12:31   #9
ЙЦУКЕН
 
Join Date: Jul 2002
Location: 0x68,0x69,0x72, 0x69,0x6e,0x67, 0x20,0x6e,0x6f, 0x77
Posts: 3,111
Rep Power: 6
Reputation: 10
Send a message via ICQ to nm
Quote:
Originally Posted by CyberJoe
Не, ну можно по короче, но не оптимальнее.
............
ну, это то-же что я сказал - вариант 1 только с ограниченим что массив содержит элементы со значениями [0, p]
nm is offline   Reply With Quote Quote selected
Old Jul 31, 2005, 12:37   #10
Дикообраз-безобраз
 
AvDav's Avatar
 
Join Date: Jul 2004
Location: У самого синего моря
Posts: 2,508
Rep Power: 4
Reputation: 44
Send a message via ICQ to AvDav
Quote:
Originally Posted by nm
int n=sz<<1;

size*size rawno size*2 tol'ko w chastnom sluchae )))
мне пора очки заказывать.
__________________
Forza Alb-Violeţii.
AvDav is offline   Reply With Quote Quote selected
Old Aug 2, 2005, 05:58   #11
джаз-оркестр
 
Hrach_Techie's Avatar
 
Join Date: Aug 2004
Location: америка
Posts: 16,224
Rep Power: 7
Reputation: 296
спасибо большое люди!!!
__________________

Hrach_Techie is offline   Reply With Quote Quote selected
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
ПОЧЕМУ ВЫ НЕ МОЖЕТЕ НАЙТИ ВАШЕГО СИСАДМИНА Sauron Fun 7 Oct 28, 2004 06:17


All times are GMT. The time now is 12:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
This board was founded on September 29, 2001
Powered by Viper Internet

Affordable Web Hosting | ParevNet

Buy text link