如何找到一个多集的所有子集,这些子集都在一个给定的集合中?
说我有一个D的多组: D = { {d, g, o}, {a, e, t, t}, {a, m, t}, } 给定一个多M,例如 M = {a, a, m, t} 我希望算法f给我M>的子集(或更确切地说是" sumbultisets")的所有元素:: f = {{a, m, t}} 如果我们只做一个这样的查询,则在D的所有元素上进行扫描(在O(#D)时间)显然是最佳的.但是,如果我们要回答有关相同D和不同M的许多此类查询,我们也许可以通过预处理D进入一些更智能的数据结构来更快. 我们可以将所有D扔进一个M的所有可能子集上,并在hashtable中查找每个可能的子集,但这是O(2^#M).适用于小M,对于中至大的M. 是否可以在#M中多项式时间进行此操作?或者,也许将已知的NP完整问题减少到这个问题,以证明不可能快速? 编辑:我只是意识到,在最坏的情况下,我们需要输出所有D,因此#D仍将出现在时间复杂性中.因此,让我们假设输出的
2 2024-01-23
编程技术问答社区
C++:多集迭代器中 next() 和 prev() 的运行时间?
在next()和prev()函数上应用multiset::iterator键入对象的时间复杂性是多少,其中相应的多序包含N元素? 我知道,在STL中,多式集体将作为平衡的二进制搜索树实现,因此,我希望时间复杂性是每个操作(在最坏情况下),以防万一我们只穿越树直到我们找到适当的值,但我有一个预感,应该平均为o(1). 但是,如果在平衡的二进制搜索树中插入元素x时,该树的实现是什么,我们还可以检索树中最大的数字小于x,而树中的最小数字大于x在O(log n)中.因此,从理论上讲,我们可以将每个节点在树中保持指向其next和prev元素,以便next()> and prev()然后以每个查询的恒定时间运行. 任何人都可以对发生的事情分享一些启示吗? 解决方案 标准任务是迭代器上的所有操作以摊销的恒定时间运行: http://www.eel.is/c+++draft/iterator.requirents#general-10 .基本思想是,每个迭代器类别仅定
2 2024-01-23
编程技术问答社区
有没有一种算法可以生成一个多集的所有唯一循环排列?
进行一些热情的编程时,我遇到了这个问题.问题可以表示如下: 对于多组A,令P(a)表示 A.的所有可能排列的集合. p(a)自然分为 等效性的分离子集 类,等价关系 存在"可以通过循环相关".枚举所有 这些等价类通过生成 恰好是其中一个成员. 例如,考虑多{0、1、1、2}.排列" 0112"和" 1201"是独特的排列,但是后者可以通过循环转移前者找到,反之亦然.所需的算法不应同时生成. 当然可以使用蛮力的方法:仅使用任何多种置换算法生成置换量 - 无论循环重复,无论循环重复如何,并与先前的结果相比,丢弃了重复.但是,这在实践中往往效率低下.所需的算法应需要最少,如果不是零簿记. 对此问题的任何见解都将得到深深的赞赏. 解决方案 其他解决方案 进行自下而上的略容易: 如果A仅包含1个元素,则P(a)还包含一个排列. 如果A仅包含2个元素,则很容易看到相同的作品. 现在,假设您已经拥有n个元素的所有p(a),并且添加一个元素. 它可以在p(
2 2024-01-22
编程技术问答社区
是否有任何适用于.Net的multiset的实现?
我正在寻找一个.NET实现多版本.谁能推荐一个好人? (多式或袋子是一个可以具有重复值的集合,您可以在其上进行设置操作:交叉点,差异等.同一产品的多次出现.) 解决方案 我不知道一个,但是您可以使用Dictionary,其中值是项目的数量.当该项目第二次添加时,您会在字典中增加其值. 另一种可能性是简单地使用List项目,您可以在其中放置重复.这可能是购物车的更好方法. 其他解决方案 任何自称为C#的多式实现的东西不应基于内部字典.词典是哈希表,无序的集合.订购了C ++的集合,多组,地图和多图.内部每个都表示为自平衡二进制搜索树的某种风味. 在C#中,我们应该使用分类数学作为我们实施的基础,因为根据Microsoft自己的文档,sortedDictionary" public class SortedMultiSet : IEnumerable { private SortedDictionary _dict; public
4 2024-01-03
编程技术问答社区
多集联合的区别给出了 "错误的类型或参数数量传递 "的错误。
我正在使用for循环将不同的值传递给光标,批量收集数据并使用多智能联合操作员将其附加到同一嵌套表中.但是,为避免重复的数据,我尝试使用MultiSet Union Distion,并且它引发了错误PLS-00306: wrong number or types of arguments in call to 'MULTISET_UNION_DISTINCT'代码效果很好,没有明显的差异.如果我在这里错过了任何东西,请告诉我. 我正在使用 Oracle数据库11G Enterprise Edition版本11.2.0.3.0-64bit Production 我的代码如下: DECLARE TYPE t_search_rec IS RECORD ( search_id VARCHAR2(200), search_name VARCHAR2(240), description VARCHAR2(240) ); TYPE t_search_dat
12 2023-11-06
编程技术问答社区
当你不需要保留秩序时,你能不能编码到更少的比特?
说您有一个32位整数的列表,并且在多键(允许复制成员的集合)中有相同的32位整数集合 由于集合不保留订单,但列表也是如此,这是否意味着我们可以用比列表更少的位编码多键? 如果是这样,您将如何编码多键? 如果这是真的,还有哪些其他示例不需要保存订单会保存位? 注意,我只是以32位整数为例.数据类型在编码中是否重要?数据类型是否需要固定长度,并且可以提供储蓄? 编辑 任何解决方案都应很好地适用于重复较低和较高重复的收集.仅通过简单地计算重复项来编码多式的高复制很明显,这是非常容易的,但是如果集合中没有重复,则需要更多的空间. 解决方案 在多音阶中,每个条目将是一对数字:整数值和集合中使用了多少次的计数.这意味着多音集​​中每个值的其他重复序列不再需要存储(您只需增加计数器)即可. 但是(假设两个值是ints),如果平均重复两次或更高的列表项目,则仅比简单列表更有效地存储 - 可能会有更有效或更高的性能方法来实现此问题,具体取决于存储数字的范围
6 2023-10-20
编程技术问答社区
生成包含一个集合的所有元素的子集的所有可能的排列组合。
让s(w)为一组单词.我想生成子集的所有可能的n组组合,以使这些子集的结合始终等于s(w). 因此,您有一个集合(a,b,c,d,e),而您并不是所有的三组合: ((a,b,c),(d),(e)) ((a,b),(c,d),(e)) ((a),(b,c,d),(e)) ((a),(b,c),(d,e)) 等... 对于每种组合,您都有3组,而这些组合的结合是原始集合.没有空集,没有丢失的元素. 必须有一种方法可以使用itertools.combination + Collection.Counter. 有人可以帮忙吗? luke 编辑:我需要捕获所有可能的组合,包括: ((a,e),(b,d)(c)) 等... 解决方案 类似的东西? from itertools import combinations, permutations t = ('a', 'b', 'c', 'd', 'e') slicer
12 2023-10-05
编程技术问答社区
用C++11将我的比较函数传递给std::multiset
我有一个std :: multiset,它存储了std ::配对.我希望第一个属性对唯一性没有限制,但是我希望第二个属性是唯一的.因此,我决定将自己的功能传递给MultiSet,以实现这一目标(如果不是,请告诉我). . 基于 this 答案,我写了类似的功能但它失败了,我不知道为什么(不知道λ-我是希腊语:)). auto f = [](std::pair& a, std::pair& b) { return (a.first ’ is not a constant-expression sorry, unimplemented: non-static data member
20 2023-09-30
编程技术问答社区
在多组中插入:在该值的第一次出现之前,而不是在最后一次出现之后。
标题所述的多空心将在所有相同值范围的末尾插入一个值. (ex:将2插入MultiSet 1,2,2,3使其1,2,2,/*new*/ 2,3). 如何在所有相同值的范围开始插入新值? (ex:插入2中的2 1,2,2,3应该使1,/*new*/ 2,2,2,3) 解决方案 尝试此 std::multiset mset { 2,4,5,5,6,6 }; int val = 5; auto it = mset.equal_range ( val ).first; //Find the first occurrence of your target value. Function will return an iterator mset.insert ( it, val ); //insert the value using the iterator 其他解决方案 使用该函数insert(iterator hint, const val
18 2023-09-30
编程技术问答社区
C++:在一个多集容器中使用自己的类
起初我是新来的,英语不是我的母语,所以对任何语法失败表示歉意,但是我发现这个社区真的很好,所以我会尽我所能提出我的问题. 我想将自己的类对象添加到STL容器多磁盘中,并想用我自己的班级定义的较少的运算符对其进行排序.我确实尝试了几种解决方案,但没有任何实际效用,所以我希望有人可以给我一些有用的提示来解决它. 这是我对班级定义的一般想法: class object { public: int first; string second; object(int f, string s) { first = f; second = s; } bool operator
6 2023-09-30
编程技术问答社区
在std::multiset中,是否有一个函数或算法可以在发现一个元素时只擦除一个样本(unicate或 duplicate)?
也许这是一个重复,但我没有发现任何搜索: 当erase(value)在std::multiset上调用所有带有该值的元素时,都会删除.我唯一能想到的解决方案是: std::multiset::iterator hit(mySet.find(5)); if (hit!= mySet.end()) mySet.erase(hit); 这还可以,但我认为可能会更好.有什么想法吗? 解决方案 自C ++ 17(请参阅在这里 ): mySet.extract(val); 其他解决方案 auto itr = my_multiset.find(value); if(itr!=my_multiset.end()){ my_multiset.erase(itr); } 我会想象有一种更干净的方法可以实现同样的方法.但这可以完成工作. 其他解决方案 尝试这个: multiset s; s.erase(s.lower_bound(va
8 2023-09-29
编程技术问答社区
"multiset "和 "multimap"--有什么意义?
正如问题所述...我不明白 multiset s / multimap s . 那么,目的是什么? 解决方案 一些用例: Multimap 将邮政编码作为钥匙,所有具有邮政编码的人 将帐户ID作为密钥,该人/帐户的所有打开订单 词典,每个关键字各种说明 Multiset 本质上是带有钥匙和整数计数的地图. 商店的清单,所有产品都有其钥匙和金额 仍然可用的是值 累积商店的销售数据,每次出售产品时 产品ID GET添加到多键,从而增加了出售的金额 其他解决方案 在向量/列表(或任何其他容器)上使用多键的最重要好处是查找操作的时间复杂性.多键的平均案例时间复杂性为O(logn),unordered_multiset为O(1).对于多键和ordered_multimap. 也是如此. 其他解决方案 一个示例,如果您在大多数情况下键是唯一的,但有时它们不是. 例如,如果您正在创建使用哈希作为键的高速缓存类.大多数情况下,两个
6 2023-09-29
编程技术问答社区
在Informix中横向不嵌套的集合派生表时出现内部错误
我正在玩有关Informix中与收集表和嵌套集合有关的信息.鉴于此模式: create table t (i int); create table u (i int, j int); insert into t values (1); insert into t values (2); insert into u values (1, 10); insert into u values (2, 20); 我尝试了以下查询: with x as ( select t.i, multiset( select * from u where u.i = t.i ) m from t order by t.i ) select * from x, lateral(table(x.m)); 第一次从DBEAVER SQL编辑器运行它会产生此错误: SQL错误[IX000]:由于内部错误,当前的交易已退回. 第二次运行它
6 2023-09-19
编程技术问答社区
Oracle SQL中的多集映射的意外结果
请帮助我确认是在下面解释的行为是一个错误,或者清楚地解释了为什么是对的. 我很有可能误解了一些概念,但是现在对我来说,它看起来像一个错误. 下面的所有示例尽可能简化,以演示问题的核心.真实情况非常复杂,因此只有与查询构建原则相关的一般答案和解决方法是可以接受的. 欢迎您在评论中询问澄清的问题,我会尽力回答它们. 感谢您的关注. :) 问题 为什么在最后一个示例(示例5)collection (select count(1) ... (select count(1) ...子查询的实例映射到表的所有行,而预期结果是将每个collection实例映射到其自己的行? 同时collections在cardinality(...)中使用的表达式正确选择. 如果以这种方式构建from或where的一部分,则存在相同的情况(不涵盖示例中). 测试模式设置 (create or replace type TabType0 as table of varchar2(1
4 2023-09-18
编程技术问答社区
将元素从一个关联容器中移出
只是为了娱乐,我实现了最简单的排序算法,可以想象: template void treesort(Iterator begin, Iterator end) { typedef typename std::iterator_traits::value_type element_type; // copy data into the tree std::multiset tree(begin, end); // copy data out of the tree std::copy(tree.begin(), tree.end(), begin); } 对于我的测试数据,它的速度仅比std::sort慢约20倍:) 接下来,我想通过移动语义提高性能: template void treesort(Ite
8 2023-09-07
编程技术问答社区
我想用C++进行多组相交的操作
我正在使用std::set和多集类std::multiset执行一些集合操作 - 联合,交点等.问题在于我必须在两个多组之间执行交叉点,以便我也得到重复值.当我将其与简单集(而不是多组)一起使用时,交叉路口正常工作. set1 = {1,2,3,4,5,6} set2 = {4,5,6,7,8,9} 然后 std :: set_intersection给我一个正确的结果,即{4,5,6} 但是,如果我有一个多动物 Multi-Set1 {1,1,1,2,2,3,3,4,4,4,5,5,6,6} MULTI-SET2 {4,4,5,5,6,6,7,7,8,8,9,9} 我再次使用std :: set_intersection它给我结果{4,5,6} 这是不正确的,因为实际交叉点为{4,4,5,5,6,6} 尽管我正在使用多组来保留交叉点的结果,但我仍然得到了错误的答案. 任何人都可以告诉我如何解决这个问题. 解决方
8 2023-08-31
编程技术问答社区
为什么两个看似lower_bound()的相同方法有不同的处理时间
当我解决一个算法问题时,由于时间问题,我的解决方案无法通过. 但是我意识到通过一个人和我的唯一区别是 bag.lower_bound(jewerly[i].first) != bag.end() //passed lower_bound(bag.begin(), bag.end(), jewerly[i].first) != bag.end() //failed 我已经使用clock()进行了检查,并且显然比另一个慢. 是什么使这两个代码之间有区别? #include #include #include using namespace std; const int MAXN = 300100; bool cmp(pair a, pair b) { if(a.second != b.second) return a.second > b.sec
14 2023-08-31
编程技术问答社区
JavaScript中是否有类似mulitiSet的东西?
我知道javaScript现在有,或者我必须自己编写编码才能进行 Red> Red-Black Tree的研究? 解决方案 没有内置的多式结构,但是 mnemonist → MultiSet tstl → TreeMultiSet 随时在此问题中添加您喜欢的图书馆. 其他解决方案 您可以使用内置地图类型和数值构建自己的多键: class Multiset { _backing = new Map(); add(value) { if (this._backing.has(value)) { this._backing.set(value, 1 + this._backing.get(value)); } else { this._backing.set(value, 1); } } delete(value) {
16 2023-08-31
编程技术问答社区