Python:如何在常量时间内获取set()中的最大元素?

时间:2017-04-09 20:18:08

标签: python set

在基于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集中实现相同的目标?

1 个答案:

答案 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)),因为你必须遍历集合 - 必须支付某个地方。