C 多查找的最佳排序算法
我需要一些建议来选择排序算法来为这个问题编码 在第一阶段,程序将从数据库中获取clientid和相应的散列(可能将使用struct)。可以有0条或数千条记录 在第二阶段,程序将使用从XML文件读取的记录来完成这一集。我已经构建了流解析器。XML文件在发票数据之前按顺序包含所有客户机信息 第二阶段完成后,程序将读取发票数据。对于每个发票,都有一个clientID,必须从客户机集中进行检查。发票的数量可以是数百万条记录 我最初的想法。因为我不知道会有多少客户机记录,所以我必须使用链表动态添加内存。在第二阶段结束时,我可以创建一个按clientID排序的数据数组,以便执行进一步的搜索,每个发票一个,可以快速检索,可能使用二进制搜索C 多查找的最佳排序算法,c,algorithm,sorting,C,Algorithm,Sorting,我需要一些建议来选择排序算法来为这个问题编码 在第一阶段,程序将从数据库中获取clientid和相应的散列(可能将使用struct)。可以有0条或数千条记录 在第二阶段,程序将使用从XML文件读取的记录来完成这一集。我已经构建了流解析器。XML文件在发票数据之前按顺序包含所有客户机信息 第二阶段完成后,程序将读取发票数据。对于每个发票,都有一个clientID,必须从客户机集中进行检查。发票的数量可以是数百万条记录 我最初的想法。因为我不知道会有多少客户机记录,所以我必须使用链表动态添加内存。在
我想知道你建议我如何处理这种情况。我应该使用什么排序算法?(我将用C编写代码)。可以说,最好的算法是满足以下条件的算法:
- 你不必写任何代码
- 您不会产生任何第三方依赖关系
- 对于你的目的来说足够快了
不能用于链接列表。我强烈建议将数据存储在动态增长的数组中;创建的摊销成本是相同的,您还可以获得其他好处(例如,内存开销越小越好)qsort
- 如果在仔细分析之后,您发现
的速度不够快,那么您可能希望转到基于哈希表的查找,因为这是O(1),而不是O(logn)。然而,不要试图写你自己的;为此使用现有库。(有关建议,请参见此处的其他答案。)bsearch
- 你不必写任何代码
- 您不会产生任何第三方依赖关系
- 对于你的目的来说足够快了
不能用于链接列表。我强烈建议将数据存储在动态增长的数组中;创建的摊销成本是相同的,您还可以获得其他好处(例如,内存开销越小越好)qsort
- 如果在仔细分析之后,您发现
的速度不够快,那么您可能希望转到基于哈希表的查找,因为这是O(1),而不是O(logn)。然而,不要试图写你自己的;为此使用现有库。(有关建议,请参见此处的其他答案。)bsearch
- 包括一个。未排序时,将允许您执行O(1)或,如果您要查找数百万张发票,这将非常有用
还有其他的可能性,比如一个排序的
客户机
结构数组,您可以通过它来执行一个任务。假设您的客户端
结构包含一个名为clientID
的unsigned int
成员。如果您的客户端ID是唯一的(不一定等同于数组索引,但不断增加),并且您有n
记录,那么您只需转到轴索引floor(n/2)
,查看您感兴趣的IDi
是否大于,等于或小于pivot索引处struct引用引用的ID,以便决定下一步查看数组的哪一半。新的枢轴索引将是该子数组上下限的中点,您将递归搜索该子数组,直到找到感兴趣的元素
通过已排序数组进行二进制搜索的查找性能为O(logn)-比哈希表慢,并且排序数组的成本为非零,但总体内存开销可能更小。如果您有足够的内存,哈希表可能会更快,因此对于大量查找来说,哈希表通常是一个很好的结构。包含一个。未排序时,将允许您执行O(1)或,如果您要查找数百万张发票,这将非常有用
还有其他的可能性,比如一个排序的客户机
结构数组,您可以通过它来执行一个任务。假设您的客户端
结构包含一个名为clientID
的unsigned int
成员。如果您的客户端ID是唯一的(不一定等同于数组索引,但不断增加),并且您有n
记录,那么您只需转到轴索引floor(n/2)
,查看您感兴趣的IDi
是否大于,等于或小于pivot索引处struct引用引用的ID,以便决定下一步查看数组的哪一半。新的枢轴索引将是该子数组上下限的中点,您将递归搜索该子数组,直到找到感兴趣的元素
通过已排序数组进行二进制搜索的查找性能为O(logn)-比哈希表慢,并且排序数组的成本为非零,但总体内存开销可能更小。如果您有足够的内存,哈希表可能会更快,因此通常是进行大量查找的良好结构。一个词:。。。或者其他的。让我们看看我是否能重申这个问题。您有一个多对一的关系,需要一个排序数组来在小表中查找clientID的外键,而大表(XMLfooMassaged)可以依次读取