这个问题类似于我以前问过的Question。
假设一个库。
图书馆有很多书(比如B(1到n))。 (n =书籍数量)
每本书都可以有很多章节(比如说C(1到k))。 (k =章节数)
每章都可以有多个课程(比如L(1到j))..(j =课程数)
每个课程都可以有多个主题(比如说T(1到i))..(i =主题数量) ... ...
现在假设我想要创建一个列表,使其具有“所有”条目,如
Book 1 Chapter 1 Lesson 1 Topic 1 ...
Book 1 Chapter 1 Lesson 1 Topic 2 ...
Book 1 Chapter 1 Lesson 1 Topic 3 ...
Book 2 Chapter 1 Lesson 1 Topic 1 ...
Book 2 Chapter 1 Lesson 1 Topic 2 ...
Book 2 Chapter 1 Lesson 1 Topic 3 ...
Book 2 Chapter 1 Lesson 1 Topic 4 ...
Book 2 Chapter 2 Lesson 1 Topic 1 ...
Book 2 Chapter 2 Lesson 1 Topic 2 ...
Book 2 Chapter 2 Lesson 1 Topic 3 ...
.....
Book (x1) Chapter (x2) Lesson (x3) Topic (x4) ...
where 1 <= x1 <= n, 1 <= x2 <= k, 1<= x3 <= j, 1< = x4 < = i
(上面的示例显示了“第1册”,第1章第1课第3课主题 和“第2册”,第2章有“第1课”,第4章有4个主题 和“第1课”和第2章中的3个主题。 ) 如何有效地生成此列表?
此外,条目“Book(x1)Chapter(x2)Lesson(x3)Topic(x4)”并不仅限于主题
(4个变量)
它也可以变化。成长或缩小。
例如:主题可以有问题,问题可以有子问题。
(根据用户选择。)
注意:这纯粹是学术性的
这个问题属于NP类问题吗?
任何编程语言..算法:)
全部谢谢
答案 0 :(得分:1)
这是一种非常常见的情况,由Relational Db模型和例如XML解决。
数据结构不能是NP问题,但是应用于您的库的算法可能是。
如果你使级别数变量,则需要一些元编程。
答案 1 :(得分:1)
这个问题是否属于NP类问题?
不,但生成所有组合在段系统的深度(书章等)中具有指数时间复杂度。
如果您有办法确定当前结构(例如章节)是否应该有孩子,您可以执行以下操作:
// The int value is the number of children
Tuple<string, int> GetChildStructure(string parentStructure) {
if(parentStructure == "Library") return new Tuple<string, int>("Book", 3);
if(parentStructure == "Book") return new Tuple<string, int>("Chapter", 2);
// ...
// You can get these from a config file/DB/etc
return null;
}
void BuildStructure(Structure parent) {
var childStruct = GetChildStructure(parent.StructName);
if(childStruct != null) {
for(int i=1; i <= childStruct.Item2; i++) {
Structure child = new Structure(childStruct.Item1, i);
BuildStructure(child);
}
}
}
void Main() {
var lib = new Structure("Library", 1);
BuildStructure(lib);
}
您还应该检查this post。