2012-06-28 87 views
5

Giả sử bạn có một Danh sách các đối tượng. Người dùng sử dụng chủ yếu tất cả các đối tượng khi anh ta đang làm việc. Làm cách nào để bạn có thể sắp xếp danh sách các đối tượng để danh sách điều chỉnh theo thứ tự, người dùng sử dụng chủ yếu? Thuật toán nào bạn có thể sử dụng cho điều đó?Thuật toán để sắp xếp danh sách các đối tượng

EDIT: Nhiều câu trả lời gợi ý đếm số lần đối tượng được sử dụng. Điều này không làm việc, bởi vì tất cả các đối tượng được sử dụng cùng một số tiền, chỉ trong các đơn đặt hàng khác nhau.

+0

Điều đó thực sự rộng. Bạn có ý tưởng về những gì bạn đang tìm kiếm cụ thể không? Bạn có dự định đặt hàng theo các cột ưa thích không? Hoặc sử dụng nhiều hơn một cách tiếp cận heuristic? –

+0

'Danh sách .Sort()?' – Habib

+0

Các đối tượng này có cùng loại không? Bạn có thể có thể tạo ra một lớp cơ sở mà tất cả các loại đối tượng sẽ kế thừa và sẽ tiết lộ (int) UsageCount bất động sản.Sau đó bạn có thể khắc phục điều này trên mỗi lần sử dụng và đặt hàng bởi nó – Dimitri

Trả lời

0

Thêm danh sách các thời điểm về thời điểm người dùng truy cập một đối tượng. Mỗi khi người dùng sử dụng một đối tượng, hãy thêm một ngày giờ.

Bây giờ, chỉ cần đếm số lượng các mục nhập datetime trong danh sách của bạn là w (hiện tại - x ngày) và sắp xếp theo đó. Bạn có thể xóa các datetimes được> (bây giờ - x ngày).

Có thể người dùng sử dụng các mục khác nhau trong một tháng, điều này sẽ phản ánh những thay đổi đó.

+0

Đây không phải là điều anh ta muốn. Nếu tôi sử dụng đối tượng A 100 lần và sau đó sử dụng đối tượng B một lần, đối tượng B sẽ ở trên cùng, trong khi anh ấy muốn đối tượng A đứng đầu kể từ khi đối tượng được sử dụng nhiều nhất – Dimitri

+0

Đủ công bằng, đã thay đổi câu trả lời của tôi. – Carra

+0

Tôi không muốn gây phiền nhiễu nhưng tại sao không chỉ thêm trường int sẽ được tăng lên mỗi khi một đối tượng được sử dụng. sau đó đặt hàng theo trường :) – Dimitri

2

Bên trong đối tượng của bạn, giữ một giá trị được sử dụng. Bất cứ khi nào đối tượng được sử dụng, tăng số lượng này. Sau đó, bạn chỉ có thể làm điều này:

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

Bạn có thể thêm một lĩnh vực NUMBER_OF_VIEWS đến lớp đối tượng của bạn, ++ nó mỗi khi sử dụng và sắp xếp danh sách của đối tượng bằng cách lĩnh vực đó. Và bạn nên tạo trường này = 0 cho tất cả các đối tượng khi number_of_views ở tất cả các đối tượng giống nhau nhưng không phải là 0.

0

Tôi cũng sử dụng bộ đếm cho từng đối tượng để theo dõi việc sử dụng nó, thay vì sắp xếp lại toàn bộ danh sách sau mỗi lần sử dụng, tôi khuyên bạn nên chỉ cần sắp xếp danh sách "cục bộ". Giống như sắp xếp bong bóng, tôi chỉ so sánh đối tượng có bộ đếm vừa được tăng lên với đối tượng phía trên và hoán đổi chúng nếu cần. Nếu hoán đổi, tôi sẽ so sánh đối tượng và đối tượng trên mới của nó và vân vân.

Tuy nhiên, nó không phải là rất khác với các phương pháp trước đây nếu sắp xếp được triển khai đúng.

0

Nếu lớp người dùng của bạn trông giống như vậy:

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

Và lớp Algo của bạn trông giống như vậy:

class Algo 
{ 
    int usedCount; 
... 
} 

Bạn sẽ có thể để ràng buộc các trường hợp cụ thể của đối tượng Algo đến đối tượng User cho phép ghi lại tần suất sử dụng. Ở cấp độ cơ bản nhất, bạn sẽ sắp xếp từng thông tin vào một tệp hoặc một luồng. Nhiều khả năng bạn muốn có một cơ sở dữ liệu để theo dõi những gì đang được sử dụng. Sau đó, khi bạn lấy User của bạn và gọi một hàm sort bạn đặt hàng các algos param của User bởi usedCount param của Algo

+0

Vấn đề là tất cả các đối tượng được sử dụng để mở rộng bằng nhau nên useCount cho mọi đối tượng là giống nhau. chỉ là thứ tự sử dụng khác nhau ... –

+0

@TombiUnnso Tôi khuyên bạn nên suy nghĩ lại về thiết kế của ứng dụng. – Woot4Moo

0

EDIT: thêm một thứ tự Preferrence !!! xem trong CODE

Tôi không thích phương pháp được sử dụng lần cuối như Carra đã nói vì nó gây ra nhiều thay đổi sắp xếp gây nhầm lẫn.

trường count_accessed là tốt hơn nhiều, mặc dù tôi nghĩ rằng nó nên được san bằng để
số lần người dùng truy cập mục này trong XX phút/giờ/ngày cuối cùng v.v ...

datastructure tốt nhất cho điều đó là chắc chắn

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; 
     } 
    } 

Hope this helps ... nó là hầu như luôn luôn O (1) BTW ...
nhắc tôi phần nào của cơ chế ngủ của Hệ điều hành

+0

Nói một người dùng hoạt động một năm với danh sách. Danh sách sau đó sẽ được sắp xếp theo xác suất của các khả năng khác nhau từ toàn bộ ví dụ đào tạo ... –

+0

Mỗi khi bạn muốn đẩy một mục lên, bạn có thể gọi Access_Detected() điều này sẽ tăng số lượng Danh sách được liên kết => càng tốt xác suất mục là đầu tiên ... nhưng những gì tôi đã cố gắng đạt được là các mục đã hoạt động rất lâu "Thời gian dài" trước đây sẽ "lỗi thời" so với các mục hiện tại. –

+0

Nút về Chỉnh sửa ... Mức độ ưu tiên thấp hơn, đối tượng càng hữu ích –

0

Có vẻ như bạn muốn có bộ nhớ cache. Tôi giả sử bạn có thể xem xét các thuật toán mà bộ nhớ cache sử dụng và sau đó đưa ra toàn bộ doanh nghiệp về chuyển ngữ cảnh ... có một thuật toán gọi là "quét đồng hồ" ... nhưng meh có thể quá phức tạp với những gì bạn đang tìm kiếm . Để đi theo cách lười biếng tôi muốn nói chỉ cần thực hiện một băm của "điều được sử dụng": num_of_uses hoặc, trong lớp học của bạn, có một var bạn ++ mỗi khi đối tượng được sử dụng.

Mỗi lần và sắp xếp giá trị băm bằng num_of_uses hoặc các đối tượng theo giá trị của biến ++ 'd của chúng.

1

Tôi sẽ tiếp tục đếm số lần đối tượng được sử dụng và theo thứ tự nó được sử dụng.

Vì vậy, nếu đối tượng X được sử dụng thứ 3, hãy tính trung bình nó với số lần chạy và sử dụng kết quả làm vị trí trong danh sách.

Ví dụ:

 
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) 

Sử dụng sẽ là bao nhiêu lần người dùng sử dụng các đối tượng, trình tự sử dụng sẽ là một danh sách (hoặc tổng hợp) về nơi mục được sử dụng theo thứ tự.

Sử dụng danh sách mỗi đơn hàng riêng lẻ có thể có một số vấn đề về hiệu suất, vì vậy, bạn có thể chỉ muốn giữ tổng số vị trí. Nếu bạn giữ một số tiền, chỉ cần thêm thứ tự vào tổng số đó mỗi khi đối tượng được sử dụng.

Để tính toán vị trí, bạn sẽ chỉ sử dụng tổng số vị trí, chia cho số lần sử dụng và bạn sẽ có mức trung bình. Tất cả những gì bạn phải làm tại thời điểm đó là sắp xếp danh sách theo mức trung bình.

Trong ví dụ trên, bạn sẽ nhận được giá trị trung bình sau (và thứ tự):

 
Object X 1.8 
Object Z 2.0 
Object Y 2.3 
0

Khi người dùng tương tác với một đối tượng, tiết kiệm ID của đối tượng trước hành động theo trên mà đối tượng thứ hai để bạn luôn có con trỏ tới đối tượng được sử dụng trước bất kỳ đối tượng nào.

Ngoài ra, lưu trữ ID của đối tượng thường được sử dụng đầu tiên để bạn biết bắt đầu từ đâu.

Khi bạn xây dựng danh sách đối tượng để hiển thị, bạn bắt đầu với đối tượng bạn đã lưu trữ làm đối tượng được sử dụng thường xuyên nhất, sau đó tìm đối tượng có ID của đối tượng được sử dụng đầu tiên được lưu trữ trên đó để hiển thị kế tiếp.

Các vấn đề liên quan