标签: multiset

C++"multiset <int>"是否有Python等价物?

我正在将一些C++代码移植到Python,其中一个数据结构是一个多重集,但我不确定如何在Python中对此进行建模.

让我们ms成为C++multiset<int>

如何ms使用(发布一些例子)

multiset<int>::iterator it = ms.find(x)
ms.erase(it)

ms.insert(x)
ms.end()
ms.lower_bound(x)
ms.clear()
Run Code Online (Sandbox Code Playgroud)

c++ python set multiset

13
推荐指数
2
解决办法
1万
查看次数

添加计数器会删除密钥

见下文,为什么+=在我原来的柜台上吹掉一把钥匙?

>>> c = Counter({'a': 0, 'b': 0, 'c': 0})
>>> c.items()
[('a', 0), ('c', 0), ('b', 0)]
>>> c += Counter('abba')
>>> c.items()
[('a', 2), ('b', 2)]
Run Code Online (Sandbox Code Playgroud)

我认为至少可以说这是不礼貌的,"X被统计0次"和"我们甚至不算Xs"之间存在很大差异.它似乎collections.Counter根本不是一个反击,它更像是一个多重集.

但是计数器是dict的子类,我们允许用零值或负值构造它们:Counter(a=0, b=-1).如果它实际上是"一包东西",这不会被禁止,限制init接受可迭代的可迭代物品吗?

进一步混淆事项,对与操作员有不同行为的反制具updatesubtract方法.看来这堂课正在发生身份危机!+-

反击是一个字典还是一个包?

python counter dictionary multiset data-structures

12
推荐指数
2
解决办法
1194
查看次数

C++:在multiset迭代器中运行next()和prev()的时间?

在相应的多集包含元素的类型对象上应用next()prev()函数的时间复杂度是多少?multiset<int>::iteratorN

据我所知,在STL中,多集合被实现为一个平衡的二进制搜索树,因此我希望每次操作时的复杂度为O(log N)(在最坏的情况下),以防我们遍历树直到找到合适的价值,但我有预感,这应该是平均O(1).

但是,如果树实现如下 - 当x在平衡二叉搜索树中插入元素时,我们还可以检索树中小于x的最大数字,并且树中的最小数字大于xO(log N).因此在理论上,我们可以让树中的每个节点都保持指向它nextprev元素的指针next(),prev()然后在每个查询的恒定时间内运行.

什么人可以分享一些关于什么的光?

c++ algorithm multiset binary-search-tree c++11

12
推荐指数
1
解决办法
690
查看次数

用于查询给定子集是否存在于集合集合中的数据结构

我正在尝试为文字游戏解算器构建数据结构.

我需要存储约150,000套形式{A,A,D,E,I,L,P,T,V,Y}.(它们是标准化的英语单词,即排序的字符.请注意,这是一个多重集,可以包含两次相同的字母.)

需要有效地获得以下类型的查询的是/否答案:是否存在具有给定子集的任何集合?例如,任何已知单词是否包含{D,E,I,L,L,P}集合?

要求:

  • 查询必须快速
  • 数据结构应适合合理的空间(例如<50 MB)
  • 数据结构不需要实时构建 ; 它是预先计算好的.

有没有适合这种需求的数据结构?这 StackOverflow上的其他 设置匹配问题略有不同,因为目标集实际上是多集的.

algorithm set subset multiset data-structures

10
推荐指数
1
解决办法
2114
查看次数

迭代`std :: multiset`的独特元素

我所需要的只是知道某些东西是否存在以及它存在多少次.我将迭代现有的东西并查询其中存在多少.

到目前为止我的实现使用multiset,我做如下:

std::multiset<thing> a;
auto previous = a.end();
for( auto each = a.begin(); each != a.end(); ++each ) {
    if( previous == a.end() || *previous != *each ) {
        a.count(*each);
    }
    previous = each;
}
Run Code Online (Sandbox Code Playgroud)

澄清

我有一个things 的向量.但是他们有时会重复这个价值,我想要迭代唯一的 things并为每个独特的事做点什么.这个"东西"需要知道它thing在矢量上出现的时间量.

我上面发布的代码就是我现在如何解决我的问题,它似乎并不是我想要的最优雅的方式.

我只是遵循Stackoverflow准则:我告诉我的问题是什么,我告诉我(尝试过)的解决方案.

如果确实需要带有问号的句子,那么你可以去:有没有办法迭代一个独特的元素multiset

c++ multiset c++11

10
推荐指数
1
解决办法
3869
查看次数

使用MATLAB生成重复的所有组合

如何创建所有K-组合,带重复一组给定(也称为K-multicombinationsmultisubsets使用MATLAB)?

这类似于笛卡尔积,但两行只有它们的排序不同应该被认为是相同的(例如,矢量[1,1,2]=~=[1,2,1]被认为是相同的),因此生成笛卡尔积然后应用unique(sort(cartesianProduct,2),'rows')应该产生相同的结果.

示例: 调用nmultichoosek(1:n,k)应生成以下矩阵:

nmultichoosek(1:3,3)
ans =
     1     1     1
     1     1     2
     1     1     3
     1     2     2
     1     2     3
     1     3     3
     2     2     2
     2     2     3
     2     3     3
     3     3     3
Run Code Online (Sandbox Code Playgroud)

matlab combinations combinatorics multiset

10
推荐指数
1
解决办法
8432
查看次数

为什么使用std :: multiset作为优先级队列比使用std :: priority_queue更快?

我尝试用std :: priority_queue替换std :: multiset。但是我对速度结果感到失望。该算法的运行时间增加了50%...

以下是相应的命令:

top() = begin();
pop() = erase(knn.begin());
push() = insert();
Run Code Online (Sandbox Code Playgroud)

我对priority_queue实现的速度感到惊讶,我预期会有不同的结果(对于PQ更好)...从概念上讲,多集被用作优先级队列。为什么优先级队列和多重集即使在情况下也具有如此不同的性能-O2

十个结果的平均值,MSVS 2010,Win XP,32位,方法findAllKNN2()(请参见下面的内容)

MS
N           time [s]
100 000     0.5
1 000 000   8

PQ
N           time [s]
100 000     0.8
1 000 000   12
Run Code Online (Sandbox Code Playgroud)

什么会导致这些结果?尚未对源代码进行其他更改...感谢您的帮助...

MS实施:

template <typename Point>
struct TKDNodePriority
{
    KDNode <Point> *node;
    typename Point::Type priority;

    TKDNodePriority() : node ( NULL ), priority ( 0 ) {}
    TKDNodePriority ( KDNode <Point> *node_, typename Point::Type priority_ ) : node ( …
Run Code Online (Sandbox Code Playgroud)

c++ performance priority-queue multimap multiset

9
推荐指数
3
解决办法
3609
查看次数

在这种情况下,为什么STL priority_queue不比multiset快得多?

我正在比较STL(g ++)priority_queue的性能,发现push和pop没有我想象的那么快.请参阅以下代码:

#include <set>
#include <queue>

using namespace std;

typedef multiset<int> IntSet;

void testMap()
{
    srand( 0 );

    IntSet iSet;

    for ( size_t i = 0; i < 1000; ++i )
    {
        iSet.insert(rand());
    }

    for ( size_t i = 0; i < 100000; ++i )
    {
        int v = *(iSet.begin());
        iSet.erase( iSet.begin() );
        v = rand();
        iSet.insert(v);
    }
}

typedef priority_queue<int> IntQueue;

void testPriorityQueue()
{
    srand(0);
    IntQueue q;

    for ( size_t i = 0; i < 1000; ++i )
    { …
Run Code Online (Sandbox Code Playgroud)

c++ performance stl priority-queue multiset

9
推荐指数
1
解决办法
3746
查看次数

使用C++中的自定义比较函数初始化多集

考虑以下比较功能:

bool compare(std::shared_ptr<myObject> &lhs, std::shared_ptr<myObject> &rhs){
   return lhs->value < rhs->value;
}
Run Code Online (Sandbox Code Playgroud)

现在的想法是初始化一个多重类型std::shared_ptr<myObject>,它对具有上述功能的元素进行排序.所以从我读过的书应该这样做:

std::multiset<std::shared_ptr<myObject>, decltype(compare)*> myset{compare};
Run Code Online (Sandbox Code Playgroud)

题:

我的问题是,在声明中,我将传递一个函数指针来引用比较函数,但为什么我们使用{compare}来启动集合?它的重要性是什么?为什么有必要这样做?

c++ decltype multiset

9
推荐指数
1
解决办法
5106
查看次数

为什么不能将带有自定义比较lambda的`std :: multiset`用作`std :: map`的值?

这是一个后续问题,询问 如何在不重载operator(),std :: less,std :: greater的情况下为std :: multiset提供自定义比较器?

并且我试图通过以下方式解决。

基本的

可以向类的成员提供自定义比较lambda函数(自以来),std::multiset如下所示:

#include <iostream>
#include <set>

const auto compare = [](int lhs, int rhs) noexcept { return lhs > rhs; };
struct Test
{
    std::multiset<int, decltype(compare)> _set{compare};
    Test() = default;
};
Run Code Online (Sandbox Code Playgroud)

很简单。

我的情况

Test班上的成员是

std::map<std::string, std::multiset<int, /* custom compare */>> scripts{};
Run Code Online (Sandbox Code Playgroud)

我尝试使用std::multisetwith自定义

  • 函子Compare(案例-1)
  • std::greater<> (案例-2)
  • lambda函数(案例-3)

前两个选项是成功的。但是,lambda作为自定义比较功能的情况却无法正常工作。这是MCVC:https ://godbolt.org/z/mSHi1p

#include <iostream>
#include <functional>
#include <string>
#include <map>
#include <set>

const …
Run Code Online (Sandbox Code Playgroud)

c++ lambda custom-compare multiset c++17

9
推荐指数
1
解决办法
395
查看次数