计算不同子序列的时间复杂度

时间:2016-03-24 04:09:21

标签: algorithm time-complexity

问题来自leetcode,我提出了以下代码,但我很难找到它的时间复杂性。任何想法如何计算其时间复杂度? (如果没有字典记忆怎么办)

        public int NumDistinct (string s, string t)
        {
            if (string.IsNullOrEmpty (s) && string.IsNullOrEmpty (t))
                return 1;
            else if (string.IsNullOrEmpty (s) || string.IsNullOrEmpty (t))
                return 0;

            return FindSequences (s, 0, t, 0);
        }

        Dictionary<string, int> memoery = new Dictionary<string, int> ();

        private int FindSequences (string s, int idxs, string t, int idxt)
        {
            if (idxt == t.Length)
                return 1;
            else if (idxs == s.Length)
                return 0;

            string key = string.Format ("{0}-{1}", idxs, idxt);
            if (memoery.ContainsKey (key))
                return memoery [key];

            int result = 0;
            if (s [idxs] == t [idxt]) {
                result = FindSequences (s, idxs + 1, t, idxt + 1) + FindSequences (s, idxs + 1, t, idxt);
            } else {
                result = FindSequences (s, idxs + 1, t, idxt);
            }
            memoery.Add (key, result);
            return result;
        }

1 个答案:

答案 0 :(得分:1)

此处的时间复杂度为O(SizeOf(s) * SizeOf(t))。如果是Dynamic Programming Solutions,您可以使用您拥有的不同状态的数量来计算时间复杂度,此处状态的数量为SizeOf(s) * sizeOf(t)

动态规划使用Memoisation的概念,即存储状态的结果,以便在我们遇到相同状态时可以使用它,因此我们有效地不进行冗余计算,因为状态经常重复,当它们出现时我们是否使用之前计算的结果来降低时间复杂度。

另请注意,时间复杂度还取决于Look up tableDP Table,在上述情况下为Dictionary,因此您还必须考虑时间{{1} }和Dictionary Look up,有效地使复杂性成为:

Dictionary Insertion