簡體   English   中英

用於排序對象列表的算法

[英]Algorithm for ordering a list of Objects

假設您有一個對象列表。 用戶在工作時主要使用所有對象。 如何訂購對象列表,以便列表適應訂單,用戶主要使用? 您可以使用什么算法?

編輯:許多答案建議計算一個對象的使用次數。 這不起作用,因為所有對象的使用量相同,只是順序不同。

在你的對象里面,保留一個usedCount。 無論何時使用該對象,都要增加此計數。 然后你可以簡單地這樣做:

objects.OrderByDescending(o => o.UsedCount);

我將保持運行計數對象的使用次數,以及它的使用順序。

因此,如果對象X使用第3個,則將其與運行計數平均,並將結果用作列表中的位置。

例如:

Item       Uses     Order of Use
---------------------------------------
Object X   10       1,2,3,1,2,1,3,1,2,2 (18)
Object Y   10       3,1,2,3,3,3,1,3,3,1 (23)
Object Z   10       2,3,1,2,1,2,2,2,2,3 (20)

用戶將是用戶使用對象的次數,使用順序將是訂單中項目使用位置的列表(或總和)。

單獨使用每個訂單的列表可能會遇到一些性能問題,因此您可能只想保留一個位置的總和。 如果保留一個總和,只需在每次使用該對象時將該順序添加到該總和。

要計算頭寸,您只需使用頭寸總和除以使用次數即可獲得平均值。 你需要做的就是按平均順序排列清單。

在上面的示例中,您將獲得以下平均值(和順序):

Object X   1.8
Object Z   2.0
Object Y   2.3

添加用戶訪問對象的日期時間列表。 每次用戶使用對象時,都要添加日期時間。

現在只計算列表中的日期時間條目數w(現在 - x天)並按此排序。 您可以刪除>(現在 - x天)的日期時間。

用戶可能在一個月內使用不同的項目,這將反映這些更改。

您可以在對象類中添加number_of_views字段,每次使用對象時都添加++,並按該字段對列表進行排序。 當所有對象的number_of_views相同但不為0時,您應該將此字段= 0設置為所有對象。

我還會為每個對象使用一個計數器來監視它的使用,但不是在每次使用后重新排序整個列表,我建議只是“在本地”對列表進行排序。 就像在冒泡排序中一樣,我只是將計數器剛剛增加的對象與上層對象進行比較,並在需要時進行交換。 如果交換,我會比較對象及其新的上層對象,依此類推。

但是,如果正確實現排序,它與以前的方法沒有太大差別。

如果您的User類如下所示:

class User  
{  
    Collection<Algo> algosUsed = new List<Algo>();     //Won't compile, used for explanation
    ...
}  

你的Algo課程看起來像這樣:

class Algo  
{  
    int usedCount;  
...  
}  

您應該能夠將Algo對象的特定實例綁定到User對象,以允許記錄它的使用頻率。 在最基本的級別,您可以將信息序列化為文件或流。 您很可能希望數據庫跟蹤正在使用的內容。 然后,當你抓你的User ,並調用sort功能,您訂購的algos的PARAM User通過usedCount的PARAM Algo

編輯:添加訂單優先!!! 看看CODE

我不喜歡卡拉所說的最后使用的方法,因為它造成了許多令人困惑的變化。

count_accessed字段要好得多,不過我認為它應該被平衡
用戶在最后XX分鍾/小時/天內訪問此項目的次數等等...

最好的數據結構肯定是

    static TimeSpan TIME_TO_LIVE;
    static int userOrderFactor = 0;

    LinkedList<KeyValuePair<DateTime, int>> myAccessList = new     LinkedList<KeyValuePair<DateTime, int>>();

    private void Access_Detected()
    {
        userOrderFactor++;
        myAccessList.AddLast(new KeyValuePair<DateTime, int>(DateTime.Now, userOrderFactor));
        myPriority += userOrderFactor; // take total count differential, so we dont waste time summing the list
    }



    private int myPriority = 0;
    public int MyPriority
    {
        get
        {
            DateTime expiry = DateTime.Now.Subtract(TIME_TO_LIVE);
            while (myAccessList.First.Value.Key < expiry)
            {
                myPriority += myAccessList.First.Value.Value; // take care of the Total Count 
                myAccessList.RemoveFirst();
            }
            return myPriority;
        }
    }

希望這有幫助...它幾乎總是O(1)BTW ......
讓我想起操作系統的睡眠機制

聽起來你想要一個緩存。 我想你可以看一下緩存使用的算法,然后拿出關於上下文切換的整個業務......有一種叫做“時鍾掃描”的算法......但是對於你想要的東西來說可能都太復雜了。 為了采用懶惰的方式,我只想說“使用過的東西”:num_of_uses,或者在你的類中,每次使用對象時都有一個var ++。

每隔一段時間用num_of_uses或對象按++的變量值對哈希進行排序。

來自https://stackoverflow.com/a/2619065/1429439

也許使用OrderedMultiDictionary,其中usedCount作為鍵,對象作為值。

當用戶與對象交互時,保存在該第二個對象上作用的前一個對象的ID,以便始終具有指向在任何給定對象之前使用的對象的指針。

此外,存儲最常使用的對象的ID,以便您知道從哪里開始。

在構建要顯示的對象列表時,首先要將您存儲的對象列表作為最常使用的對象,然后搜索其上存儲了第一個使用的對象ID的對象,然后再顯示該對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM