示例#1
0
void merge_sort(VInt& arr, int p, VInt& sarr)
{
    int len = arr.size();
    int leftLen = p ;
    int rightLen = len - p;
    
    VInt leftSorted;
    VInt rightSorted;
    //cout<<"ll "<<leftLen<<"rl "<<rightLen<<endl;
    if(leftLen > 1) {
        VInt larr(arr.begin(), arr.begin() + p);
        merge_sort(larr,leftLen/2, leftSorted);
    } else{
        //cout<<"only one left"<<endl;
        leftSorted.push_back(arr[0]);
    }
    
    if(rightLen > 1) {
        VInt rarr(arr.begin() + p, arr.end());
        merge_sort(rarr,rightLen/2, rightSorted);
    } else {
        //cout<<"only one right"<<endl;
        rightSorted.push_back(arr[1]);
    }
    
    
    combine(leftSorted, rightSorted, sarr);
    
}
TEST(Util, RandomOrderTest) {
    VInt tmp;
    RandomOrder(100, 1000, &tmp);
    SInt dic;
    ToSet(tmp, &dic);
    EXPECT_EQ(100, dic.size());
    int c = 0;
    for (size_t i = 0; i < tmp.size(); i++) {
        if (tmp[i] == i) {
            c++;
        }
    }
    EXPECT_LT(c, 3);
}
示例#3
0
bool
HigherOrder::removeEle(const VInt& face, int ele)
{
    SInt fs(face.begin(), face.end());
    SInt& eles = midele[fs];
    eles.erase(ele);

    if (eles.empty()) {
	// remove the face
	midele.erase(fs);
	ho.erase(fs);
    }
    
    return eles.empty();
}
示例#4
0
int main()
{
    dumpVector(gInputArray);
    
    VInt sorted;
    merge_sort(gInputArray, gInputArray.size()/2, sorted);
    dumpVector(sorted);
    
}
示例#5
0
void Grath::job() {
    int n, m, i;
    cout << "Введите количество вершин и количество рёбер:"<<endl;
    // Прочитаем граф
    scanf("%d%d", &n, &m);
    graph.resize(n);
    cout<< "Вводите рёбра:"<<endl;
    while(m--) {
        int from, to;
        scanf("%d%d", &from, &to);
        graph[from - 1].push_back(to - 1);
        graph[to - 1].push_back(from - 1);
    }

    // Запустим первый поиск (вычислим enter и low)
    vrem.assign(n, 0);
    parents.assign(n, -1);
    enter.resize(n);
    low.resize(n);

    double t1 = omp_get_wtime(); // системное время до выполнения функции

    for(i = 0; i < n; i++)
        if(vrem[i] == 0)
        {   Cout_iter++;
            visitLow(i);
        }

    // Запустим второй поиск (определение идентификаторов bcc)
    // Второй поиск запускается "по следам" первого,
    // то есть проходит по уже найденному дереву
    bcc.assign(n, -1);
    for(i = 0; i < n; i++)
        if(parents[i] == -1)
        {
            Cout_iter++;
            visitBCC(i);
        }
    // Выведем результат
    VVPInt comps(newIndex);
    for(i = 0; i < n; i++)
        for(VIter it = graph[i].begin(); it != graph[i].end(); it++)
            if(i < *it)
            {
                Cout_iter++;
                int id = getBCC(i, *it);
                if (id != -1)
                    comps[id].push_back(PInt(i, *it));
            }
    double t2 = omp_get_wtime(); // время после выполнения функции
    bool z=false;
    for(i = 0; i < newIndex; i++) {
        printf("Компонент %d: ", i+1);
        for(VPIter edge = comps[i].begin(); edge != comps[i].end(); edge++)
        {
            printf("(%d, %d) ", edge->first + 1, edge->second + 1);
            z=true;
        }
        printf("\n");
    }
    if (z==false)
        cout<<"Нет компонентов!"<<endl;
    double time = t2 - t1;
    cout<<"Время выполнения: "<<time<<endl;
    cout<<"Количество базовых операций: "<<Cout_iter<<endl;
}
示例#6
0
int SumTopN(const VInt &src, int len) {
  return std::accumulate(src.begin(), src.begin() + len, 0);
}
示例#7
0
Str Join(const VInt &data, const Str &del) {
  return Join(data.begin(), data.end(), del);
}
示例#8
0
void
HigherOrder::addEle(const VInt& face, int ele)
{
    SInt fs(face.begin(), face.end());
    midele[fs].insert(ele); 
}
示例#9
0
void combine(VInt& l, VInt& r, VInt& output)
{
    int i = 0;
    int j = 0;
    while( i < l.size() && j < r.size()) {
        
        if(l[i] < r[j]) {
            output.push_back(l[i++]);
        } else {
            output.push_back(r[j++]);
        }
    }
    
    VIter o_end = output.end();
    
    if( i < l.size()) {
        output.insert(o_end, l.begin()+ i, l.end());
    } else {
        output.insert(o_end, r.begin() + j, r.end());
    }
    
}