我最近写了下面的算法的共同元素:算法:选择一个集合
给定一组标签,和一群 博客文章,其中一篇博客文章可以 包含零至-many标签,返回所有帖子通用的 标签。
这种比较是在内存中正在做 - 访问任一集合不原因的跨网络跳闸(即,到数据库,等等)。
另外,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便宜地订购blogpost,则此代码运行得更快。另外我觉得有一个错误,当第一篇文章有2个标签,第二个0,它会返回第一篇文章的2标签。 – 2010-12-02 20:28:23