Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 多查找的最佳排序算法_C_Algorithm_Sorting - Fatal编程技术网

C 多查找的最佳排序算法

C 多查找的最佳排序算法,c,algorithm,sorting,C,Algorithm,Sorting,我需要一些建议来选择排序算法来为这个问题编码 在第一阶段,程序将从数据库中获取clientid和相应的散列(可能将使用struct)。可以有0条或数千条记录 在第二阶段,程序将使用从XML文件读取的记录来完成这一集。我已经构建了流解析器。XML文件在发票数据之前按顺序包含所有客户机信息 第二阶段完成后,程序将读取发票数据。对于每个发票,都有一个clientID,必须从客户机集中进行检查。发票的数量可以是数百万条记录 我最初的想法。因为我不知道会有多少客户机记录,所以我必须使用链表动态添加内存。在

我需要一些建议来选择排序算法来为这个问题编码

在第一阶段,程序将从数据库中获取clientid和相应的散列(可能将使用struct)。可以有0条或数千条记录

在第二阶段,程序将使用从XML文件读取的记录来完成这一集。我已经构建了流解析器。XML文件在发票数据之前按顺序包含所有客户机信息

第二阶段完成后,程序将读取发票数据。对于每个发票,都有一个clientID,必须从客户机集中进行检查。发票的数量可以是数百万条记录

我最初的想法。因为我不知道会有多少客户机记录,所以我必须使用链表动态添加内存。在第二阶段结束时,我可以创建一个按clientID排序的数据数组,以便执行进一步的搜索,每个发票一个,可以快速检索,可能使用二进制搜索


我想知道你建议我如何处理这种情况。我应该使用什么排序算法?(我将用C编写代码)。

可以说,最好的算法是满足以下条件的算法:

  • 你不必写任何代码
  • 您不会产生任何第三方依赖关系
  • 对于你的目的来说足够快了
考虑到数千条记录基本上都没有,我建议使用它进行排序和搜索;这两个都在C标准库中

需要注意的问题:

  • qsort
    不能用于链接列表。我强烈建议将数据存储在动态增长的数组中;创建的摊销成本是相同的,您还可以获得其他好处(例如,内存开销越小越好)

  • 如果在仔细分析之后,您发现
    bsearch
    的速度不够快,那么您可能希望转到基于哈希表的查找,因为这是O(1),而不是O(logn)。然而,不要试图写你自己的;为此使用现有库。(有关建议,请参见此处的其他答案。)


可以说,最好的算法是满足以下标准的算法:

  • 你不必写任何代码
  • 您不会产生任何第三方依赖关系
  • 对于你的目的来说足够快了
考虑到数千条记录基本上都没有,我建议使用它进行排序和搜索;这两个都在C标准库中

需要注意的问题:

  • qsort
    不能用于链接列表。我强烈建议将数据存储在动态增长的数组中;创建的摊销成本是相同的,您还可以获得其他好处(例如,内存开销越小越好)

  • 如果在仔细分析之后,您发现
    bsearch
    的速度不够快,那么您可能希望转到基于哈希表的查找,因为这是O(1),而不是O(logn)。然而,不要试图写你自己的;为此使用现有库。(有关建议,请参见此处的其他答案。)

    • 包括一个。未排序时,将允许您执行O(1)或,如果您要查找数百万张发票,这将非常有用

      还有其他的可能性,比如一个排序的
      客户机
      结构数组,您可以通过它来执行一个任务。假设您的
      客户端
      结构包含一个名为
      clientID
      unsigned int
      成员。如果您的客户端ID是唯一的(不一定等同于数组索引,但不断增加),并且您有
      n
      记录,那么您只需转到轴索引
      floor(n/2)
      ,查看您感兴趣的ID
      i
      是否大于,等于或小于pivot索引处struct引用引用的ID,以便决定下一步查看数组的哪一半。新的枢轴索引将是该子数组上下限的中点,您将递归搜索该子数组,直到找到感兴趣的元素

      通过已排序数组进行二进制搜索的查找性能为O(logn)-比哈希表慢,并且排序数组的成本为非零,但总体内存开销可能更小。如果您有足够的内存,哈希表可能会更快,因此对于大量查找来说,哈希表通常是一个很好的结构。

      包含一个。未排序时,将允许您执行O(1)或,如果您要查找数百万张发票,这将非常有用

      还有其他的可能性,比如一个排序的
      客户机
      结构数组,您可以通过它来执行一个任务。假设您的
      客户端
      结构包含一个名为
      clientID
      unsigned int
      成员。如果您的客户端ID是唯一的(不一定等同于数组索引,但不断增加),并且您有
      n
      记录,那么您只需转到轴索引
      floor(n/2)
      ,查看您感兴趣的ID
      i
      是否大于,等于或小于pivot索引处struct引用引用的ID,以便决定下一步查看数组的哪一半。新的枢轴索引将是该子数组上下限的中点,您将递归搜索该子数组,直到找到感兴趣的元素


      通过已排序数组进行二进制搜索的查找性能为O(logn)-比哈希表慢,并且排序数组的成本为非零,但总体内存开销可能更小。如果您有足够的内存,哈希表可能会更快,因此通常是进行大量查找的良好结构。

      一个词:。。。或者其他的。让我们看看我是否能重申这个问题。您有一个多对一的关系,需要一个排序数组来在小表中查找clientID的外键,而大表(XMLfooMassaged)可以依次读取