在基于C ++的集合中,您可以通过在常量时间内使用迭代器来读取最大或最小的元素。 例如:
std::set<int> exampleSet ;
exampleSet.insert(1);
exampleSet.insert(2);
exampleSet.insert(3);
std::set<int>::iterator it=exampleSet.end();
it--;
cout << *it << endl;
// prints: 3
我们如何在常规时间内在Python集中实现相同的目标?
答案 0 :(得分:0)
你所要求的是ordered set。也许最好在Python案例中说sorted
,因为有序集合配方按插入顺序保存元素。
根据@ user2357112的评论,默认情况下不支持此功能。在这样的集合中插入会更长(非常数),但是某些比较运算符定义的最大值/最小值将在O(1)处可用。
如果您不关心插入复杂性,一个简单的解决方案是将集合保存为python中的列表,自己维护集合行为。一种简单的昂贵方式:
#init
MySet = sorted([...],key = lambda x: "Your key" )
#Insert:
MySet = set(MySet)
MySet.add("New element")
MySet = sorted(MySet,key = lambda x: "Your key" )
#Retrieve min/msx:
MySet[0],MySet[-1]
当然,你应该将它包装在一个类中。也可能在实施方面有所作为。
修改强>
摩西让我感觉不好半,所以另一个简单,可能更好的解决方案:
如果您确定没有删除元素,例如,您可以在保存min和max元素的集合周围使用包装类。
如果你确实想要删除,这仍然有效,但删除最小/最大时删除将是O(N)(而不是~O(1)),因为你必须遍历集合 - 必须支付某个地方。