Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

оценка эффективности поразрядной MSD сортировки

48K
12 июня 2009 года
killa_
2 / / 18.05.2009
Код:
template <class T>
void vector<T>::msd_sort(int ll, int rr, int dd, vector<int> vectc)
{
    int l=ll;
    int r1=10;
    int i,j,maxa,ost,jj,del,cif;
    r0=this->size()-1; //размер вектора
    int r=rr;
    int d=dd;
    vector<int> count(r1+1);
    maxa=vect[l];
    if (d==1)
    {
        for (i=l;i<=r;i++)
        {
            if (vect>maxa)
            {
                maxa=vect;
            }
        } //находим максимальное значение в векторе
        if (maxa==0)
            k=1;
        else
        {
            k=0;
            while(maxa>=1)
            {
                k=k+1;       //определяеям количество разрядов
                maxa=maxa/10;
            }
        }
    }
    if (d>k) return;
    for (j=0;j<r1;j++)
    {
        count[j]=0;
    }
    for (i=l;i<=r;i++)
    {
        ost=vect;
        for (jj=1; jj<=d; jj++)
        {
            del=pow(10,k-jj);
            cif=ost;
            ost=fmod(ost,del);
            cif=(cif-ost)/del;
        }
        j=cif;
        count[j+1]=count[j+1]+1;
    }
    for (j=1;j<r1;j++)
    {
        count[j]=count[j]+count[j-1];
    }
    for (i=l;i<=r;i++)
    {
        ost=vect;
        for (jj=1; jj<=d; jj++)
        {
            del=pow(10,k-jj);
            cif=ost;
            ost=fmod(ost,del);
            cif=(cif-ost)/del;
        }
        j=cif; // это цифра в числе
        vectc[count[j]]=vect;
        count[j]=count[j]+1;
    }
    for (i=l;i<=r;i++)
    {
        if (vect==vectc[i-l])
        {
            com++;   //вот момент истины 1
        }
        else
        {
            com++;  //момент истины 2
            ex++;
            vect=vectc[i-l];
        }
    }
    msd_sort(l, l+count[0]-1, d+1, vectc);
    for (i=1;i<r1;i++)
    {
        if (count-1-count[i-1]>=1)
        msd_sort(l+count[i-1], l+count-1, d+1, vectc);
    }
};

алгоритм закоден с учебника, так что тут просто разобраться я думаю. но если есть вопросы, то поясню. завтра просто сдавать надо:confused: , а инфы никакой :(
смысл следующий: это код процедуры поразрядной MSD сортировки. перерыл кучу литературы в том числе и в инете, но толкового ответа так и не нашел. там в основном идут временные характеристики эффективности. в тестах использую целые числа (массив из целых). оценкой эффективности является число выполненных сравнений (com) и число обменов значениями(ex), ну и в итоге сумма. каждое из числа сравнений или обменов не на много отличается от n*LOG(n,10), но в сумме эта оценка превышает теоретическую в 2 раза. это первый момент. второй момент, когда я задаю вектор до 20000 элементов, и провожу тест по двум случаям : случайно заполненный вектор (натуральными) или упорядоченный вектор (по убыванию), то вроде как худший случай для алгоритма - это обратно упорядоченный(или нет?) дает чуть чуть бОльшие показатели, нежели у рандомного вектора, а вот начиная с 20000 и до 100000 размера упорядоченный вектор обрабатывается за меньшее количество сравнений и обменов. не могу понять логики, может кто-нить объяснить?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог