好的,所以我需要设计以下算法(无需代码,只需要步骤):
分别设置两组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
,其长度分别为B
和m
,其中每组中的数字是不同的,未分类的,n
。计算两个集合的交集和并集,两个结果中没有任何重复值。该算法应该在O(mlog(n))时间内工作。
我很难找到具有这种时间复杂度的算法。最初,我想连接两个未排序的数组,然后对它执行合并排序并删除重复项,但这会超出规定的复杂性。
答案 0 :(得分:1)
我想念了性能要求。解决方案位于O(n log(m))
,而不是O(m log(n) )
中的要求。
所需的运行时间是不可能的。证据已在评论中草拟。基本思想是转到A
是单例集的极端情况。然后,性能要求归结为检查给定元素是否包含在运行时B
中的集合O(log(|B|))
中。据我所知,这只有在B
被排序或B
之上存在某种索引结构时才有可能。
O(blog(m))
解决方案
作为m<n
,您可以对A
进行排序,结果为As
。排序A
为O(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))