在选择正确的数据结构时需要帮助

时间:2018-10-08 05:57:39

标签: c# algorithm data-structures

我下面有键值格式的数据,首先我想按CustomerID汇总金额,然后按降序对金额进行排序。

`
public class Customer
{
    public string CustomerId { get; set; }
    public double Amount { get; set; }
}

List<Customer> customers = new List<Customer>()
{
    new Customer{
        CustomerId ="C1",
        Amount = 10
    },
    new Customer{
        CustomerId ="C2",
        Amount = 20
    },
    new Customer{
        CustomerId ="C1",
        Amount = 30
    },
    new Customer{
        CustomerId ="C3",
        Amount = 30
    },
    new Customer{
        CustomerId ="C4",
        Amount = 5
    }
};
`

在最终输出中,我想将客户分类为前25%的最大值,接下来的25%的最大值和其余客户。

此处的预期输出为:-

在前25%中,客户C1的金额为40 接下来的25%,客户C3数量为30 休息时,客户C2和C4来了。

我试图使用列表和字典解决此问题,但是输入数据太大,因此执行代码需要花费很长时间。另外,字典正在为该代码占用大量内存。我想知道什么是解决此问题的最佳数据结构。

1 个答案:

答案 0 :(得分:0)

我不确定您是否必须有List个客户。

但是,如果我在流程中一步一步地获得Customer,并且需要将数据存储在某个地方,那么我将实现如下所示的数据结构。

static Dictionary<string, double> customerDataTable = new Dictionary<string, double>();

在此流程中,如果需要现成的Dictionary<string, double>对象,可以使用Dictionary<string, Customer>代替Customer

然后我将提供一种更新该表的方法,例如

    static void UpdateCustomerRecord(string customerId, double amount)
    {
        if (customerDataTable.ContainsKey(customerId))
            customerDataTable[customerId] = customerDataTable[customerId] + amount;
        else
            customerDataTable.Add(customerId, amount); 
    }

并调用此方法将很简单,如下所示,

UpdateCustomerRecord("c1", 10);
UpdateCustomerRecord("c2", 20);
UpdateCustomerRecord("c1", 30);
UpdateCustomerRecord("c3", 30);
UpdateCustomerRecord("c4", 5);

在这里您必须注意,我已经淘汰了Customer类,但是如果您的情况不可行,您可以使用Customer类实现相同的流程(正如我上面已经提到的那样) )。

  • 在这里,当您对数据进行临时分类时(前40%,后40%,依此类推),则无需保留数据的临时副本。
  • 您可以轻松地在其上使用Linq
  • 您可以轻松浏览字典

根据数据量,将存在内存需求。这是肯定的。为了优化它,您可以重新考虑所需的数据和数据类型。 (例如,如果您需要全额金额,但少于255,则可以使用字节而不是双字节)