用于查找可以由列表中的其他单词构成的最长单词的python代码的时间复杂度

时间:2015-05-10 14:44:19

标签: python performance big-o time-complexity

我正准备进行一些编码访谈,并提出了解决以下问题的方法:

"找到可以由单词列表中的其他单词组成的最长单词"。

我很难搞清楚算法的时间复杂度。如果你能帮助我弄清楚以下代码的时间复杂性,那就太好了。

超过n⋅log n进行排序,number_of_words ⋅ word_length + recursion),但不确定如何计算由递归部分引起的确切复杂性。

def valid_pair(a,b, words):
    return  a in words and b in words

def valid_word(word, words):
    for i in range(len(word)):
        left, right = word[:i], word[i:]
        valid =  valid_pair(left, right, words)
        if valid:
            return valid
        elif left in words:
            return valid_word(right, words)

    return False


words = ["cde","abcde","bcd","c","d","e","a"]

words = sorted(words, key = len, reverse = True)
for w in words:
    if valid_word(w, words):
        print w
        break

1 个答案:

答案 0 :(得分:1)

n为列表中的字数,m为最长字的长度。

for循环迭代words,直到valid_word返回true。最糟糕的情况是,非单词可以与列表中的其他单词连接。因此,这会为您提供一个因子n

valid_word遍历单词中的所有字符并调用valid_pair,其复杂度为O(f),其中f = f(n,m)in运算符的复杂性。 (我不知道,它是如何实现的)。如果left中的每个字符words都在right,但valid_word不是m,则会valid_word递归调用O(m!⋅f(n,m))次,从而产生以下公式:

T(m) = f + Σi=1,...m-1 T(m-i) < f + (m-1) ⋅ T(m-1) < m!⋅f 

所以O(n⋅m!⋅f(n,m) + n⋅log(n))位于words = ['ab ac ad ae','ab ac ad af', ... , 'ab ac ad az', 'ab ac ad', 'ab ac', 'ab'] (可以改进)。

所有复杂性都是angular.module('starter.controllers', []) .controller('AppCtrl', function() {}) .controller('DeviceCtrl', function($ionicPlatform, $scope, $cordovaDevice) { $ionicPlatform.ready(function() { $scope.$apply(function() { // sometimes binding does not work! :/ if(window.StatusBar) { // org.apache.cordova.statusbar required StatusBar.styleDefault(); } // getting device infor from $cordovaDevice var device = $cordovaDevice.getDevice(); $scope.manufacturer = device.manufacturer; $scope.model = device.model; $scope.platform = device.platform; $scope.uuid = device.uuid; }); }); })。这是一个上限,所以也许你可以通过显示不可能有一个强制算法执行所有步骤的输入来改善这一点。

但是想想这样的输入(空格只是为了更好的可读性)

<ion-view view-title="Device Information">

    <ion-content>
        <div class="card">
            <div class="item item-divider">
                Your device information!
            </div>
            <div class="item item-text-wrap">
                <ul class="list">
                    <li class="item">
                        Manufacturer : {{manufacturer}}
                    </li>
                    <li class="item">
                        Model : {{model}}
                    </li>
                    <li class="item">
                        Platform : {{platform}}
                    </li>
                    <li class="item">
                        UUID : {{uuid}}
                    </li>
                </ul>
            </div>
            <div class="item item-divider text-right">
                 
            </div>
        </div>
    </ion-content>
</ion-view>

这些单词中没有一个可以与其他单词连接,但算法必须尝试多种组合。这个例子可以改进和扩展。