Повторяя один и тот же элемент - PullRequest
0 голосов
/ 06 февраля 2019

Я написал алгоритм обмена четностью и бинарного поиска.X и Y - две случайные последовательности.Первый шаг, X и Y делят строку на блоки, которые означают 1000 битов на 100 * 10 подмножеств, каждое подмножество имеет 100 битов.X и Y будут обмениваться информацией четности о подмножествах, если несовпадение четности, они вызывают метод двоичного поиска, чтобы найти ошибку и исправить ее.Все это происходит в первой итерации.Во второй итерации (максимум это занимает 4 итерации) X и Y случайным образом перемешивают свои 1000 битов, повторяют один и тот же алгоритм чётного обмена и двоичного поиска.Всякий раз, когда X и Y тасуют свои 1000 бит, алгоритм показывает исправленный дополнительный бит (changeindex).Хотя я заметил, что этот неправильный результат начинает появляться в последующих шаффлах.Я пытаюсь исправить это, чтобы не допустить повторения одного и того же индекса или рассматривать неправильную разницу в качестве ответа, но я не смог.Пример: если разница в позициях X и Y равна 5 3 110 521 891 974, но когда она исправляется, она показывает дважды, например, 5 3 110 110 521 521 891 974 974.

clear all; clc; close all;

X = randi([0,1],1000,1);

Y = bsc(X,0.02);

X_Original = X; Y_Original = Y;

diff_ind = [];

for i = 1:length(X)

    if X_Original(i) ~= Y_Original(i)

        diff_ind = [diff_ind i];

    end

end

changeindex = [];

Iteration = 1;

ind = [1:length(X)]';

while length(changeindex) < length(diff_ind)

    block_dim = Iteration*36;

    %% defining the length

    for div = 1:floor(length(X)/block_dim)

        tX = X(1+(div-1)*block_dim:div*block_dim);

        tY = Y(1+(div-1)*block_dim:div*block_dim);

        tind = ind(1+(div-1)*block_dim:div*block_dim);

        len = length(tX);

       backup_tX = [];

       backup_tY = [];

       backup_ind = [];

        pass = 0;

        while len > 1

            pass = pass + 1;

            %             fprintf('Parity Number: %d\n',pass);

if mod(len,2) == 1

                x = [tX(1:(len-1)/2) tX(1+(len-1)/2:len-1)];

                y = [tY(1:(len-1)/2) tY(1+(len-1)/2:len-1)];

                tind = [tind(1:(len-1)/2) tind(1+(len-1)/2:len-1)];

            else

                x = [tX(1:(len)/2) tX(1+(len)/2:len)];

                y = [tY(1:(len)/2) tY(1+(len)/2:len)];

                tind = [tind(1:(len)/2) tind(1+(len)/2:len)];

            end

             %% parity exchange 

            b1 = sum(x(:,1)) == sum(y(:,1));

            b2 = sum(x(:,2)) == sum(y(:,2));


            if (b1 == false)  && (b2 == true)

                tX = x(:,1);

                tY = y(:,1);

                tind = tind(:,1);

            elseif (b2 == false)  && (b1 == true)

                tX = x(:,2);

                tY = y(:,2);

                tind = tind(:,2);

            elseif (b1 == false)  && (b2 == false)

                tX = x(:,1);

                tY = y(:,1);

                if isempty(backup_tX)

                    backup_tX = x(:,2);

                    backup_tY = y(:,2);

                    backup_ind = tind(:,2);

                else

                    backup_tX = [x(:,2); backup_tX];

                    backup_tY = [y(:,2); backup_tY];

                    backup_ind = [tind(:,2); backup_ind];

                end

                tind = tind(:,1);

            else


                break;

            end

            len = length(tX);

            if len == 1

                tY = tX;

                Y(tind) = tX;

              %  fprintf('Change made at index: %d\n',tind);

                changeindex = [changeindex tind];

                                 if ~isempty(backup_tX)

                                    tX = backup_tX;

                                    tY = backup_tY;

                                    tind = backup_ind;

                                    len = length(tX);

                                    backup_tX = [];

                                    backup_tY = [];

                                     backup_ind = [];

                                end

            end

        end

    end


    if block_dim > length(X)

        break;

    else

        %% Shuffle

           chng = randperm(length(X));

        X = X(chng);

        Y = Y(chng);

        ind = ind(chng);

        Iteration = Iteration + 1;

    end

end

disp('------------------------');

disp('Original difference index:');

disp(sort(diff_ind));

disp('Changes made at index:');

disp(sort(changeindex));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...