Dữ liệu không phân loại dữ liệu thuật toán đồng nhất / đồng nhất


8

Trong nỗ lực không phát minh lại một bánh xe, tôi hỏi liệu có ai có ý tưởng về thuật toán đồng nhất dữ liệu không. Một ví dụ ngắn gọn:

Dữ liệu của tôi có một số yếu tố có thể như

  1. Con số
  2. Màu sắc
  3. Trái cây
  4. Lá thư

Có khoảng 100 trong số các yếu tố này trong một mảng. Thuật toán cần sắp xếp các phần tử sao cho bất kỳ 2 mục nào có cùng số được đặt cách nhau càng nhiều càng tốt, và giống nhau với màu sắc, trái cây, v.v. Cũng tốt nếu tôi có thể ưu tiên các phần tử. Cảm giác như bạn sẽ không bao giờ đạt được 100% vì vậy bạn sẽ cho nó một số đường chuyền để thực hiện, kiểm tra kết quả, sau đó thử nhiều đường chuyền hơn.

Tôi sẽ không ngạc nhiên nếu có thứ gì đó ở đây chỉ hoạt động mà tôi không có đủ google-fu để tìm.


Bạn đã thử một cái gì đó như tìm kiếm di truyền ?
David Weiser

3
Bạn viết như một người nói tiếng Anh bản địa, vì vậy hãy làm việc viết lên một chút. Vui lòng xóa từ 'như' nơi nó không thuộc và đánh bóng các câu của bạn nói chung. Ngoài ra, quan tâm để cung cấp một ví dụ? Tôi chưa hiểu hết câu hỏi của bạn.
Công việc

3
Ví dụ rất cần thiết. Một trường hợp thử nghiệm đơn vị là rất quan trọng cho loại điều này. Một đoạn văn bản không phải là một trường hợp thử nghiệm.
S.Lott

Câu trả lời:


2

Loại này đã làm tôi chán nản trong một thời gian vì vậy tôi phải đến xem nó đã được giải quyết chưa. Đây là ý tưởng của tôi. Từ đầu, không phải là một ứng dụng của bất kỳ thuật toán nào tôi biết. Đây sẽ là một thuật toán vũ phu khá đắt tiền, nhưng nó sẽ khá hiệu quả. Giả sử bạn đang xử lý tập dữ liệu nhỏ thực sự mà bạn đã mô tả (100 hàng 4 cột) và đang làm việc trên máy tính hiện đại với đủ ram.

Tổng quan : Chúng tôi sử dụng thuật toán đệ quy trên danh sách được sắp xếp để phân tán các bản ghi tương tự với khoảng cách maxiumum của chúng trong các bản ghi tương tự. Sau mỗi cuộc gọi, tất cả các bản ghi có cùng cha mẹ đều ở khoảng cách tối đa. Cuộc gọi hàng đầu bao gồm tất cả các hồ sơ. Vì vậy, nó unorts từ trong ra ngoài.

Cấu trúc dữ liệu :

  • newIndexeslà một array<integer>. Chỉ mục của mảng là chỉ mục hiện có của hàng. Giá trị sẽ là chỉ mục mới, bắt đầu bằng -1
  • datalà một array<array<string>>. Khóa là chỉ mục, mảng bên trong là biểu diễn chuỗi của các giá trị trong một hàng. Không cần phải là một chuỗi nếu bạn có một số cách để nhóm dữ liệu của bạn. Phần tử mảng đầu tiên là phần tử có trọng lượng lớn nhất.

Sắp xếp datatheo thứ tự trọng lượng. Sắp xếp nó trước theo cột có trọng số lớn nhất, trong đó theo cột có trọng số lớn thứ 2, v.v ... Kết quả là nghịch đảo với những gì bạn muốn. Chỉ số tuần tự.

Đây là đại số (trong mã psudo).

        // siblingCount: On first call is the number of rows in the table,
    //    on recursive calls it is the number of elements with the same parent
    // index: the index of current row in `data` - starts 0
    // depth: The element index - starts 0
    void unsort(int siblingCount, int index, int depth)
    {
        int count = 1;
        string hash = concatColumns(index, depth + 1);
        while ((index + count < data.count) && (hash == concatColumns(index + count, depth + 1)))
        {
            count++;
        }

        if (depth < columnCount)
            unsort(count, index, depth);
        else if (index < data.count)
            unsort(count, index + count, 0);

        int spacing = siblingCount / count;

        for (int i = 0; i < count; i++)
        {
            var offset = 0;
            while ((newIndexes[index + i + offset] > -1) & (index + i + offset + 1 < newIndexes.count))
                offset++;

            if (newIndexes[index + i + offset] > -1) throw new Exception("Shouldn't happen.");

            newIndexes[index + i + offset] = index + spacing * i;
        }
    }

    string concatColumns(int index, int count) // returns count columns concatinated
    {
        // 1,1 = "1"
        // 1,2 = "1, blue"
        // 1,3 = "1, blue, apple"
        return "1, blue, apple";
    } 

Sau đó, áp dụng các chỉ số mới cho dữ liệu để được sắp xếp.

Suy nghĩ về cách tiếp cận: Không kiểm tra điều này, nhưng việc lưu trữ các Index mới và giải quyết xung đột có thể gặp vấn đề vì các chỉ mục đầu tiên được chỉ định dựa trên các cột ít quan trọng nhất, vì vậy nếu có nhiều xung đột thì các cột quan trọng hơn có thể co cụm. Có thể thử áp dụng bù là dương trước, sau đó âm. Hoặc có thể thực hiện sắp xếp chèn trong danh sách được liên kết thay vì mảng.


Ah! Tôi rất thấy những gì bạn đang nhận được ở đây. Sắp xếp, sau đó tách riêng dựa trên kích thước của chuỗi giống nhau. Nếu điều này không hoạt động hoàn toàn thì nó sẽ khá gần. Cảm ơn sự giúp đỡ của bạn và dọn dẹp câu hỏi! Hy vọng tôi sẽ dùng thử lần sau khi tôi cần xử lý loại dữ liệu này vào tháng 9
ExoByte

Hãy cho tôi biết làm thế nào nó hoạt động.
Jim McKeeth

4

Điều đó làm tôi nhớ đến một số thuật toán mạng mà tôi đã thấy, từ khóa 'tkwikibrowser' 'TouchGraphWikiBrowser', trong đó các yếu tố được kết hợp với một loại dây cao su, nhưng giống như nam châm của cùng một pol.

Tôi không biết điều gì sẽ là cơ học, kéo theo trường hợp của bạn, nhưng có lẽ 'trường hợp' là từ khóa phù hợp: các yếu tố được đưa vào một vụ án và bị đẩy ra khỏi biên giới của vụ án và đẩy nhau ra , hơn nữa, nếu chúng có nhiều thuộc tính chung.

Họ bắt đầu trong các tư thế ngẫu nhiên, và di chuyển phụ thuộc vào khoảng cách đến tường, và khoảng cách đến các yếu tố tương tự, và tìm kiếm một vị trí ổn định.

Công thức để đẩy nhau ra xa có thể là tuyến tính hoặc bậc hai đến khoảng cách và bạn có thể tìm kiếm một công thức tốt trực tiếp, bằng cách thao tác các giá trị.

cập nhật:

Đối với sức mạnh thu hút, bạn có thể chỉ cần nghịch đảo sức mạnh gây mất tập trung. Vì vậy, nếu 2 yếu tố chia sẻ không phải là một thuộc tính duy nhất, đây sẽ là điểm thu hút tối đa.


OK, tôi sẽ cắn. Tôi đã thực hiện một tìm kiếm Google trên tkwikibrowser và không có gì. Bạn có thể liên kết để biết thêm thông tin?
Jim McKeeth

Bạn nói đúng, tôi xin lỗi, tên không phải là TKWiki ..., mà là TGWiki ... cho TouchGraph, như ở đây , nhưng tôi chỉ tìm thấy ảnh chụp màn hình này, không có bản demo hoạt động, nơi các nút di chuyển như trên dải cao su .
người dùng không xác định

3

Sử dụng xáo trộn ngẫu nhiên hoặc sắp xếp theo hàm băm của dữ liệu được nối: một hàm băm tốt cho đầu ra rất khác nhau cho các đầu vào tương tự, do đó, các mục tương tự trong bất kỳ chiều nào cũng phải được tách ra.


1
Đây có vẻ là giải pháp đơn giản nhất, nhưng bây giờ tôi thực sự tò mò cách thức này sẽ thực hiện với dữ liệu trong thế giới thực.
TheLQ

Vấn đề với điều đó trong khi hàm băm tương tự nhau không giống nhau, hàm băm của các hàng giống hệt nhau sẽ tạo ra cùng một hàm băm và sau đó sắp xếp thành liền kề.
Jim McKeeth

Và sẽ có sự trùng lặp chính xác trong dữ liệu. Đây có thể là một nơi thú vị để bắt đầu mặc dù.
ExoByte

@Jim McKeeth: Đúng vậy. Tất nhiên, bạn cũng có thể nối một chỉ mục để làm cho các hàng giống hệt nhau được phân biệt bằng một số lượng nhỏ bit. Bạn cũng có thể xem xét các đường cong thứ tự Z (thu được một cách tầm thường bằng cách xen kẽ bit), phân phối dữ liệu tuyến tính theo không gian sao cho dữ liệu gần đó vẫn như vậy. Bạn đang tìm kiếm một hoán vị mang lại nghịch đảo của điều đó.
Jon Purdy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.