2013-10-17 37 views
1

我在考虑如何在数据结构中表示函数依赖关系。代表函数依赖关系的数据结构

功能降级(数据库的关系模式)将一组属性映射到一组属性。例如。在{A,B} - > {C,d}的属性C和d是有功能的依赖于A和B.

我能想到的四种可能的情况这里:

  1. {A} - > {B}(两个单一属性)
  2. {A,B} - > {C}(一组属性意味着一个属性)
  3. {A} - > {B,C}属性集合)
  4. {A,B} - > {C,D}(一组属性意味着一组属性)

我的第一种方法是简单的两个成员等级:

class attribute 
{ 
    string name; 
    set<attribute*> dependent_on; 
} 

这与像(1),但与(2)函数依赖工作 - (4) - 我想。 实际上,我可以分解(3),但我无法用这样的类来表示(2)和(4)。

我要保持的信息是c d是有功能的依赖于 B,所以我将不得不使一个类似attributegroup其中一组属性被映射到一组属性。例如: -

class attributegroup 
{ 
    set<attribute*> members; 
    set<attribute*> dependent_on; 
} 

因此,实际上我可以简单地代表一个单独的属性为attributegroup只有一个成员。但我不认为这是做这件事的最好方法。

任何帮助/想法赞赏:)

+0

对于您建议的方法,您有哪些具体问题? –

+0

我没有特别的问题。我只是觉得可能会有更好的一个。通过我的方法,这将产生一个'set ',这就像@DieterLücking提供的方法一样,它实现了必须迭代所有'attributegroup'的算法。 –

+1

好的 - 下一个问题:我们要做什么而不必检查所有'atributegroup's?我们需要知道后面想要实现的算法,以便说明启用它们的数据结构应该是什么样子。 –

回答

1

我不会存储在依赖属性:

include <iostream> 
#include <map> 
#include <vector> 

struct Attribute; 
typedef std::vector<Attribute> Attributes; 
struct Attribute { 
    char name; 
    operator Attributes() const { return Attributes{ 1, *this }; } 
}; 

inline bool operator < (const Attribute& a, const Attribute& b) { 
    return a.name < b.name; 
} 

inline bool operator < (const Attributes& a, const Attributes& b) { 
    return std::lexicographical_compare(
     a.begin(), a.end(), 
     b.begin(), b.end()); 
} 

inline std::ostream& operator << (std::ostream& stream, const Attributes& attributes) { 
    for(const auto& a: attributes) { 
     std::cout << a.name; 
    } 
    return stream; 
} 

typedef std::multimap<Attributes, Attributes> AttributeDependencies; 
typedef AttributeDependencies::value_type AttributeDependency; 

int main(int argc, const char* argv[]) { 
    Attribute a {'A'}; 
    Attribute b {'B'}; 
    Attribute c {'C'}; 
    Attribute d {'D'}; 

    AttributeDependencies dpendencies; 
    dpendencies.insert(AttributeDependency(a, b)); 
    dpendencies.insert(AttributeDependency(Attributes{a, b}, c)); 
    dpendencies.insert(AttributeDependency(a, Attributes{b, c})); 
    dpendencies.insert(AttributeDependency(Attributes{a, b}, Attributes{c, d})); 
    for(const auto& d: dpendencies) { 
     std::cout << '{' << d.first << "} -> {" << d.second << "}\n"; 
    } 
    return 0; 
} 

注:一个std ::地图可能是正确的容器,但标准:: multimap中配合示例数据。

+0

那么,其实我正在考虑这种实现(虽然我宁愿将std :: set设置为std :: vector以避免重复)。但是当我需要循环遍历所有的依赖关系(将会是O(n^2)还是我缺少某些东西?)时,我对运行时有一些担心。 所以我希望有一些“怪异”的数据结构,大多数人都不会想到。 –