我有一个算法搜索目录并搜索该目录和任何子目录中的所有文本文件。假设我不知道父目录中有多少个子目录和子子目录。我如何计算复杂性?
这是我正在使用的代码
public List<string> GetFilesInDirectory(string directoryPath)
{
// Store results in the file results list.
List<string> files = new List<string>();
// Store a stack of our directories.
Stack<string> stack = new Stack<string>();
// Add initial directory.
stack.Push(Server.MapPath(directoryPath));
// Continue while there are directories to process
while (stack.Count > 0)
{
// Get top directory
string dir = stack.Pop();
try
{
// Add all files at this directory to the result List.
files.AddRange(Directory.GetFiles(dir, "*.txt"));
// Add all directories at this directory.
foreach (string dn in Directory.GetDirectories(dir))
{
stack.Push(dn);
}
}
catch(Exception ex)
{
}
}
return files;
}
感谢
答案 0 :(得分:3)
Big-O表示法说明了当参数大小增加时问题复杂性如何增长。换句话说,当元素集增加时,时间复杂度如何增长。 1或8972348932文件/目录无关紧要。您的代码在O(N)线性时间内工作,假设目录和文件只访问过一次。 O(123N)仍然写为O(N)。这是什么意思? 这意味着Big O符号没有说明实际的初始成本。只有复杂性如何增长。
针对同一问题比较两种算法,该算法在O(N)时间和O(N log N)时间内运行。对于小于N的O(N log N)算法可能比O(N)算法更快,但是如果N足够大,则O(N)将会赶上。
答案 1 :(得分:1)
我会说所有目录中的文件数量都是O(N)。
导航这些目录并不是一项复杂的任务,只需要记账。
答案 2 :(得分:1)
您的算法会推送堆栈上的所有目录,并且对于遇到的每个目录都有效,因此复杂度按目录次数2或O(2n)的顺序排列,其中n是目录数,复杂度为关注这相当于O(n)。
答案 3 :(得分:0)
时间复杂度按n
计算,其中n
将是正在处理的项目数。你不需要确切的数字,而且你不能使用确切数字来表示大O复杂性,因为你正试图计算最坏情况的运行时间。
答案 4 :(得分:0)
更糟糕的情况是运行时间是目录树最大深度的函数(在windows中受最大路径长度的限制)和子目录中允许的文件数
答案 5 :(得分:0)
我会说它是O(N ^ 2),因为你有一个双嵌套for循环,但每个循环的大小不一样,所以我们必须稍微修改它。
目录数可能小于文件数。因此,假设文件数为N,目录数为M,则得到O(N * M)。这是我最好的猜测。