我最近寫了下面的算法的共同元素:算法:選擇一個集合
給定一組標籤,和一羣 博客文章,其中一篇博客文章可以 包含零至-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