计算O(mlogn)时间内两个未排序数组的并集和交集

时间:2016-03-08 20:56:20

标签: algorithm set time-complexity theory array-algorithms

好的,所以我需要设计以下算法(无需代码,只需要步骤):

分别设置两组var App = Backbone.View.extend({ el: 'body', events: { "input #searchBox" : "prepCollection", "click #listing li" : "track", "click #save": "saveClicked", "click #savefoodday": "savefoodClicked", "click .destroy": "destroy" }, initialize: function () { this.model = new SearchList(); this.foods = new AllFoods(); this.journal = new FoodJournalDay(); this.model.on('destroy', this.remove, this); this.listenTo(this.journal, 'destroy', this.renderfoods); this.foods.fetch(); }, saveClicked: function() { this.listenTo(this.journal, 'add', this.renderfoods); this.journal.create(new Food({ id: foodid, title: item_name, brand: brand_name, calories: calorieAmt, fat: fatAmt, sodium: sodiumAmt, protein: proteinAmt, carbs: carbsAmt, sugar: sugarAmt, html: trackedhtml })); }, destroy: function (e) { var model = new FoodJournalDay({ id: id }); this.journal.remove(); }, var app = new App(); }); A,其长度分别为Bm,其中每组中的数字是不同的,未分类的,n。计算两个集合的交集和并集,两个结果中没有任何重复值。该算法应该在O(mlog(n))时间内工作。

我很难找到具有这种时间复杂度的算法。最初,我想连接两个未排序的数组,然后对它执行合并排序并删除重复项,但这会超出规定的复杂性。

1 个答案:

答案 0 :(得分:1)

我想念了性能要求。解决方案位于O(n log(m)),而不是O(m log(n) )中的要求。

所需的运行时间是不可能的。证据已在评论中草拟。基本思想是转到A是单例集的极端情况。然后,性能要求归结为检查给定元素是否包含在运行时B中的集合O(log(|B|))中。据我所知,这只有在B被排序或B之上存在某种索引结构时才有可能。

O(blog(m))解决方案

作为m<n,您可以对A进行排序,结果为As。排序AO(m log(m)) < O(m log(n) )

在排序As中查找元素位于O(log(m))。因此,您只需要检查B的每个实例,并确定它是否包含在As中。

结果运行时(滥用表示法)是 O(n log(n))+ m* O(log(n)) = O(n log(n))+ O(n* log(m))=O(n log(m))