c++ - 一种获得元素休闲组合的好算法

标签 c++ performance combinations

我尝试编写一个应用程序,该应用程序将具有名为“special_reorder”的函数,并且是我应用程序的核心。也许这是我的应用程序中最复杂的功能。此函数是类似于 std::map 的类的类成员,但它不会自动对包含的元素进行排序。在函数调用之后,应该按照将 map 元素放入下一个不同顺序的方式重新创建此类对象。我想要完成的事情是,每个下一个函数调用都应该使下一个唯一元素的序列与之前出现在该对象中的任何元素序列不同,直到该函数被调用 n 次,其中 n 是所有不同组合的数量。我数学不好,但我知道排列数是 x! = n 其中 x 是 map 中的元素数量。我希望这个功能不要那么慢。我认为键应该主要用于重新排序,因为它们在我的应用程序的类实例中属于短类型。

这是一个类代码:

#ifndef MY_MAP_H
#define MY_MAP_H

template<typename A, typename B>
class my_map
{
    private:
    int count, len ;
    A *keys ;
    B *values ;

    void resizeContent()
    {
        A *new_k = new A[len * 2] ;
        B *new_val = new B[len * 2] ;
        for(int aa = 0; aa < len; aa++)
        {
            new_k[aa] = keys[aa] ;
            new_val[aa] = values[aa] ;
            delete[] keys ;
            delete[] values ;
            keys = new_k ;
            values = new_val ;
            len *= 2 ;
        }
    }

    public:
    my_map()
    {
        count = 0 ;
        len = 10 ;
        keys = new A[len] ;
        values = new B[len] ;
    }
    ~my_map()
    {
        delete[] keys ;
        delete[] values ;
    }

    void special_reorder()
    {

    }

    int size()
    {
        return count ;
    }

    void replace(int first, int second)
    {
        if(first >= count || second >= count || first < 0 || second < 0)
        return ;
        A k_tmp = keys[first] ;
        B v_tmp = values[first] ;
        keys[first] = keys[second] ;
        values[first] = values[second] ;
        keys[second] = k_tmp ;
        values[second] = v_tmp ;
    }

    void insert(A key, B val)
    {
        if(count == len)
        resizeContent() ;
        keys[count] = key ;
        values[count++] = val ;
    }

    B& operator[] (const int index)
    {
        return values[index] ;
    }
} ;

#endif

请帮助我实现该功能或给我一些关于如何执行此操作的好主意。

最佳答案

由于您使用的是 C++,请考虑

std::next_permutation

作为您问题的解决方案。

关于c++ - 一种获得元素休闲组合的好算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25835951/

相关文章:

vb.net - 为什么数据表的加载方法有时这么慢?

performance - 开发人员应该首先考虑可读性还是性能?

matlab - 使用 MATLAB 生成所有重复组合

c++ - 通过调用 CreateRemoteThread : crash 弹出 dll

c++ - 使用 boost::asio(pion 库)的 https 服务器提示 "no shared cipher"

python - 如何在cython中使用并行性

python - 如何矢量化 3D Numpy 数组

python - 如何在Python(使用Itertools)中生成所有不同的组合(其中输入元素重复)?

c++ - 双自由或腐败(出): 0x0000000001a880a0 *** on combinatory algorithm using vectors

c++ - 构图模式