在内置字符串 sort() 中使用 lambda 作为键,难以识别 Big-O
Using a lambda as key within builtin string sort(), hard to identify Big-O
我编写的以下代码获取 y
中的每个字符串并将字谜放在列表中:
>>> y = ['eat','beat','sweet','tea', 'eta', 'teews', 'leet', 'tele']
>>> y.sort(key=lambda x: sorted(x))
>>> y
['beat', 'eat', 'tea', 'eta', 'leet', 'tele', 'sweet', 'teews']
在尝试为此解决方案指定时间复杂度时,我遇到了困难。我认为它是 O(nlogn) 但我不确定 lambda 在这里实际做了什么。主要是因为我实际上不确定引擎盖下发生了什么python。
谁能阐明在 pythons 字符串排序内置函数中使用 lambda 作为键的时间复杂度?
排序时作为参数传递的 lambda 函数对 iterable 中的每个元素应用一次,并用于彼此之间的比较。
y.sort(key=lambda x: sorted(x))
表示对于列表 y
中的每个元素 x
,将调用 stored(x)
并将确定哪个字符串必须在最终列表中排在第一位。
由于排序确实是 O(n log n)
,并且说您的列表包含 m
个平均长度 n
的字符串,我会说这里的复杂度是 O(m * (n log n) + (m log m))
。
@Delgan 有一个很好的答案,但由于我今天在做 lambda roll,我将投入我的 0.02 美元。 lambda 只是一个匿名函数。我将你的重写为常规函数,并包含一个 print
以查看排序键的样子。
>>> def my_sorted_key_fctn(key):
... sorted_key = sorted(key)
... print(sorted_key)
... return sorted_key
...
>>> y = ['eat','beat','sweet','tea', 'eta', 'teews', 'leet', 'tele']
>>> y.sort(key=my_sorted_key_fctn)
['a', 'e', 't']
['a', 'b', 'e', 't']
['e', 'e', 's', 't', 'w']
['a', 'e', 't']
['a', 'e', 't']
['e', 'e', 's', 't', 'w']
['e', 'e', 'l', 't']
['e', 'e', 'l', 't']
>>> y
['beat', 'eat', 'tea', 'eta', 'leet', 'tele', 'sweet', 'teews']
>>>
您按键的字母按字母顺序对列表进行了排序。
但在这种情况下您不需要 lambda。如果 lambda 所做的只是调用一个与 lambda 具有相同参数的函数......那么它根本没有做任何有用的事情。就用原来的功能。
>>> y.sort(key=sorted)
>>> y
['beat', 'eat', 'tea', 'eta', 'leet', 'tele', 'sweet', 'teews']
>>>
我编写的以下代码获取 y
中的每个字符串并将字谜放在列表中:
>>> y = ['eat','beat','sweet','tea', 'eta', 'teews', 'leet', 'tele']
>>> y.sort(key=lambda x: sorted(x))
>>> y
['beat', 'eat', 'tea', 'eta', 'leet', 'tele', 'sweet', 'teews']
在尝试为此解决方案指定时间复杂度时,我遇到了困难。我认为它是 O(nlogn) 但我不确定 lambda 在这里实际做了什么。主要是因为我实际上不确定引擎盖下发生了什么python。
谁能阐明在 pythons 字符串排序内置函数中使用 lambda 作为键的时间复杂度?
排序时作为参数传递的 lambda 函数对 iterable 中的每个元素应用一次,并用于彼此之间的比较。
y.sort(key=lambda x: sorted(x))
表示对于列表 y
中的每个元素 x
,将调用 stored(x)
并将确定哪个字符串必须在最终列表中排在第一位。
由于排序确实是 O(n log n)
,并且说您的列表包含 m
个平均长度 n
的字符串,我会说这里的复杂度是 O(m * (n log n) + (m log m))
。
@Delgan 有一个很好的答案,但由于我今天在做 lambda roll,我将投入我的 0.02 美元。 lambda 只是一个匿名函数。我将你的重写为常规函数,并包含一个 print
以查看排序键的样子。
>>> def my_sorted_key_fctn(key):
... sorted_key = sorted(key)
... print(sorted_key)
... return sorted_key
...
>>> y = ['eat','beat','sweet','tea', 'eta', 'teews', 'leet', 'tele']
>>> y.sort(key=my_sorted_key_fctn)
['a', 'e', 't']
['a', 'b', 'e', 't']
['e', 'e', 's', 't', 'w']
['a', 'e', 't']
['a', 'e', 't']
['e', 'e', 's', 't', 'w']
['e', 'e', 'l', 't']
['e', 'e', 'l', 't']
>>> y
['beat', 'eat', 'tea', 'eta', 'leet', 'tele', 'sweet', 'teews']
>>>
您按键的字母按字母顺序对列表进行了排序。
但在这种情况下您不需要 lambda。如果 lambda 所做的只是调用一个与 lambda 具有相同参数的函数......那么它根本没有做任何有用的事情。就用原来的功能。
>>> y.sort(key=sorted)
>>> y
['beat', 'eat', 'tea', 'eta', 'leet', 'tele', 'sweet', 'teews']
>>>