查找500,000个航班的航班连接的算法

时间:2015-04-30 07:08:04

标签: c# sql algorithm sql-server-2008 graph

有大约500,000条记录,我想为之前的航班找到Onward航班。一个例子就是这样:

Flight 1    Rodez - Beziers
Flight 2    Beziers - Biarritz
Flight 3    Biarritz - Rodez 
Flight 4    Blois - Montauban

现在从上面我们可以发现Flight 1的前方是Flight 2。类似地,Flight 2的前方是Flight 3Flight 4没有前进,它本身也不是任何一个。

我可以使用Graphs在C#中执行此操作,但我不知道如何处理如此多的数据(500,000条记录)。或者,如果我在SQL中执行此操作,我该如何处理它?注意我不想要一个我想知道的完整实现:​​

  
      
  1. 首先 - 我是否应该在C#或SQL中执行此操作,因为性能是一个问题。
  2.   
  3. 第二 - 如何在没有任何数据结构的情况下在SQL中实现此算法,如图。
  4.   

2 个答案:

答案 0 :(得分:0)

基本上,你在这里拥有的是ORIGIN和DEST(INATION)。

我首先要获取未出现在DEST列中的所有ORIGIN的列表。这些不是转发航班,所以我们称之为STARTP(OINTS)。

SQL解决方案:

对于STARTP中的每一个,将其设置为锚点,然后运行递归语句,该语句将连接前进航班(在任何ORIGIN记录中查找先前的DEST值)。

答案 1 :(得分:0)

我是否应该在C#或SQL中执行此操作,因为性能是一个问题

SQL比代码处理更快,因为它只是对静态数据的逻辑访问。您应该在SQL中明确地模拟您的问题。 这意味着,您还应该使用stored procedures来快速执行定期查询。

如何在没有任何数据结构的情况下在SQL中实现此算法,如Graph

如果您还没有数据库,请创建一个可以模拟问题的数据库。例如,如果我是你,我会有一个表:

              ***** FLIGHT *****

FLIGHT_Id    FLIGHT_cityBegin    FLIGHT_cityEnd

1            Rodez               Beziers
2            Beziers             Biarritz  

知道前飞航班的存储程序如下:

USE [your_database_name]
GO

CREATE PROCEDURE your_procedure_name 
        @sql_flight_id    int
AS

DECLARE @sql_return       int
        SELECT            @sql_return = FLIGHT_Id
        FROM              [dbo].[FLIGHT]
        WHERE             FLIGHT_cityEnd = (SELECT  FLIGHT_cityBegin
                                            FROM    [dbo].[FLIGHT]
                                            WHERE   FLIGHT_Id = @sql_flight_id)
RETURN 0

并在服务器端(C#)使用此存储过程:

protected int getFlightOnward(int flightId) 
{
    int id_flight_onward = -1;

    string connection_string = /* get database infos */;
    SqlConnection con = new SqlConnection(connection_string);

    try 
    {
        con.Open(); 
        SqlCommand com = new SqlCommand("your_procedure_name", con);
        com.CommandType = CommandType.StoredProcedure;
        com.Parameters.Add(new SqlParameter("@sql_flight_id", flightId);
        SqlParameter return_value = com.Parameters.Add("@sql_return", SqlDbType.Int);
        return_value.Direction = ParameterDirection.Output;

        com.ExecuteNonQuery();

        id_flight_onward = int.Parse(com.Parameters["@sql_return"].Value.ToString());
    }
    catch 
    {
        con.Close();
    }

    return id_flight_onward;
}

如果未找到任何航班,则上述函数返回-1,否则它将返回航班的ID。