我使用以元组为键的字典创建了一个矩阵(例如{(user,place):1})
我需要计算矩阵中每个位置的欧几里得。 我已经创建了一个方法来实现这一点,但它效率非常低,因为它遍历每个地方的整个矩阵。
data
有没有办法更有效地做到这一点? 我需要将结果放在字典中,将地点作为键,将欧几里德作为值。
答案 0 :(得分:1)
您可以使用字典理解(使用矢量化形式比for循环快得多)并将条件(0或1)的结果累加为欧几里德值:
def calculateEuclidian(self, place):
return {place: sum(p==place and val==1 for (_,p), val in self.matrix.items())}
根据您当前的数据结构,我怀疑您是否有办法避免遍历整个字典。
答案 1 :(得分:1)
如果你不能使用另一种方式(或辅助方式)表示你的数据,那么遍历dict
的每个元素都是有效的(渐近),因为没有办法问一个dict
tuple
(_, place)
为您提供所有符合_
键的元素(其中dict[Place, list[User]]
表示“任意值”)。编写迭代代码还有其他更简洁的方法,但是你无法摆脱渐近效率的限制。
如果这是您最常用的操作,并且您实际上可以使用其他方式表示数据,则可以使用len(...)
代替。这样,您可以在O(1)时间内获取某个位置的所有用户的列表,而您需要做的就是使用sqrt
函数计算列表中的项目。 (1)。显然,你仍然需要最终采用$ heroku buildpacks:add heroku/nodejs
。
答案 2 :(得分:1)
您可能希望从当前字典创建一个新字典,该字典不适合此类搜索,并创建一个以place
为键的字典,并将(user,value)
元组列表作为值
获取place
键下的元组列表(快速),然后计算value
为1的时间(线性,但在一小组数据上)
保留原始字典以进行欧几里德距离计算。希望您不要在程序中经常更改数据,因为您需要保持两个序列同步。
答案 3 :(得分:1)
可能有一些方法可以让它更像Pythonic,但我认为你不能改变总体复杂性,因为你根据键和值进行查询。我认为你必须在整个矩阵中搜索你的实例。