如何在c ++中优化我的查询?

时间:2011-03-22 11:08:11

标签: c++ c mfc visual-c++

在我的应用程序中,我在对象列表(即对象数组)中保存了数千条记录。我喜欢根据记录中的日期,名称等特定方案检索数据。

我的想法是,在for循环中,我将数据与每条记录进行比较,然后检索记录并发送给用户。

但我觉得这不是个好主意。

我需要任何建议。

此致

KARTHIK

3 个答案:

答案 0 :(得分:4)

如果您在单个字段(例如名称)上进行比较,则可以按排序顺序维护数组,并使用binary search检索每条记录。

看起来您正在按多个字段(日期,名称等)进行排序。您可以保留多个已排序的副本(使用指针,以便您没有多个副本),然后使用这些副本来检索它们。将其隔离在适当的类后面,您可以随时将您的想法改为另一种选择(如内存数据库)。

也许最好的解决方案是使用不同的密钥保持多个地图

class MyDatabase {
  private:
    std::map<date,Record*> indexedByRecord;
    std::map<name,Record*> indexedByName;
  public:
    Record* getByName(const name& name) const;
    Record* getByDate(const date& date) const;
}

等等。这通常使用引擎盖下的二叉搜索树。

答案 1 :(得分:1)

由于你也提到了c,如果列表是静态的,你可以实现有序的指针数组。

    int num_records = number_of_records_in_array;
    Record **Records_by_name = malloc(sizeof(Record *)*num_records);
    Record **Records_by_date = malloc(sizeof(Record *)*num_records);

然后将每个指针分配给记录。

    Record **by_name = Records_by_name;
    Record **by_date = Records_by_date;

//not sure how your records are stored in memory but you need to copy a
//pointer to both by_name and by_date
    for(int i=0; i<num_records; i++) { 
      *by_name = Records_array+i;
      *by_date = *by_name;
      by_name++;
      by_date++;
    }

然后你必须按照各自的字段对指针数组进行排序,剩下的就是对它们进行二进制搜索......

当我们需要通过不同字段快速查找大量数据时,我会一直使用它。

答案 2 :(得分:0)

您是否考虑过使用哈希表? ...实际上你可以有几个不同的散列表,每个散列表都存储一个指向堆上所讨论的实际记录的指针,并且根据你想要查询的数据在每个表中散列指针。这将为每个查找提供持续的复杂性(即O(1))。

因此,例如,您将在堆上创建一条记录并获取指向该记录的指针。然后,如果您对记录中的日期或名称感兴趣,则会有两个哈希表,一个表示日期,另一个表示名称。将哈希函数应用于名称的记录,并根据哈希函数的结果将指针存储在相应的表槽中。然后在存储指向原始记录的指针的单独哈希表中对日期执行相同操作,但根据日期字段进行哈希处理。然后你应该得到一些非常快速的查找。插入也应该非常快,并且哈希函数也应该在恒定时间内执行(假设你有足够大的哈希表)。

如果您对自己制作一个不感兴趣,可以使用std::unordered_map在c ++ 0x中获取哈希表。否则,您可以使用std::vector<std::list<RECORD_TYPE*> >作为基本容器,使用插入等功能基本包装一个类(在使用它之前首先将其调整为适当的大小...最好是大于记录数的素数你打算插入)。

希望这有帮助,

杰森