【发布时间】:2010-12-02 19:56:48
【问题描述】:
我最近不得不写以下算法:
给定一组标签,以及一组 博客文章,其中博客文章可能 包含零对多标签,返回 所有帖子共有的标签。
此比较是在内存中完成的 - 访问任一集合不会导致跨网络(即,访问数据库等)。
此外,Tags 集合没有对包含它的 BlogPosts 的引用。 BlogPosts 有一组 Tags 它们包含。
以下是我的实现。它执行得很好,但我很好奇是否有更好的方法来实现它。
我的实现是在 Actionscript 中,但从算法的角度来看,我更好奇,所以任何语言的示例都可以。 (但如果我不懂语言,我可能会要求你澄清一些方面)
任何改进的例子都会受到极大的欢迎。
private function getCommonTags(blogPosts:Vector.<BlogPost>):Vector.<Tag>
{
var commonTags:Vector.<Tag> = new Vector.<Tag>();
if (!blogPosts || blogPosts.length == 0)
return commonTags;
var blogPost:BlogPost = blogPosts[0];
if (!blogPost.tags || blogPost.tags.length == 0)
return commonTags;
commonTags = Vector.<Tag>(blogPosts[0].tags);
for each (var blogPost:BlogPost in blogPosts)
{
if (!blogPost.tags || blogPost.tags.length == 0 || commonTags.length == 0)
// Updated to fix bug mentioned below
// Optomized exit - there are no common tags
return new Vector.<Tag>();
for each (var tag:Tag in commonTags)
{
if (!blogPost.containsTagId(tag.id))
{
commonTags.splice(commonTags.indexOf(tag),1);
}
}
}
return commonTags;
}
【问题讨论】:
-
我不知道 Actionscript,但是如果您可以通过 blogPost.tags.length 廉价地订购 blogposts,这段代码会运行得更快。另外我认为当第一篇文章有 2 个标签而第二个 0 时存在错误,它将返回第一篇文章的 2 个标签。
-
@krusty.ar 谢谢!按标签数量排序是个好主意。我认为您提到的错误是由于我代表我重命名了一些糟糕的变量 - 我已经编辑了代码,如果您仍然看到错误,请告诉我(我没有)。
-
好吧,假设 blogPosts[0].tags.lenght == 2 和 blogPosts[0].tags.lenght == 0,for each 循环的第一遍会比较两个标签第一篇文章有第一篇文章的 2 个标签,它们是相同的,所以 commonTags.lenght == 2,在循环的第二遍中,blogPost.tags.length == 0,所以使用“优化退出”,但是仍然是 commonTags.lenght == 2,所以您要返回第一篇文章的标签,而第二篇文章没有,正确的版本将类似于 return new Vector.
(); -
你是绝对正确的。谢谢 - 我会解决的。
标签: algorithm performance language-agnostic