在数据列中查找紧密数字

时间:2014-02-13 16:11:34

标签: sorting

我有3列数据(一天中的小时数)

  

C1 C2 C3

     

01 05 00

     

05 09 06

     

11 11 10

     

16 17 14

     

20 22 18

我需要能够将其分成n×3矩阵,其中每行上的三个数字彼此相距+/- 2小时。 (每行的范围必须<= 4)

每列中的每个值只能使用一次,因此如果有多个组合使用相同的数字,则会忽略其中一个组合。

所以最终的结果是:

  <05> 05 05 06(摘自 C1 中的第2位, C2 中的第1位, C3 中的第2位)

     11 09 10(摘自 C1 中的第3名, C2 中获得第2名, C3中获得第3名

     

16 17 18(摘自 C1 中的第4位, C2 中的第4位, C3 中的第5位)

每列中的数据必须保留在最终矩阵的同一列中,例如 C1 中的16位需要位于最终矩阵的第一列。

我真的很难找到一种方法将它放入代码中,你能帮忙吗?

2 个答案:

答案 0 :(得分:0)

我设法让这几乎在MATLAB中工作,我不认为它特别有效或聪明但它完成了工作。

然而,它依赖于第一列中的值,将其视为中点。

这意味着第2列和第3列中的允许点必须为+/-2

C1 中的值是下限(eg. 30)而其他2个值比 C1 中的值高4的情况是被归类为无效,虽然它在技术上仍然是一种解决方案。

x = [1,5,0; 5,9,6; 11,11,10; 16,17,14; 20,22,18];

d=size(x); %Get the size in of x in the form [row,col]
rows=d(1); %Number Of Rows
cols=d(2); %Number Of Columns
clear d;

y = nan(rows,cols); %nan Matrix the same size as x used for the output

a = ones(1,cols); %Keep track of the current index in question in each column
c = 0; %Number of "matches" or rows that are valid in the output matrix

time = zeros(1,cols); %Keep track of the current values in each column

while(max(a)<rows+1) %For every row check that no index is invalid
    time(1)=x(a(1),1); %Get the value in column1
    b = 2; %column counter

    skip=0; %Increment the counter for column 1 if this is true

    while(b<cols+1&&~skip&&max(a)<rows+1) %For columns 2->cols, if we don't need to skip the value in column 1 and all the indexes are valid.
        time(b)=x(a(b),b); %Get the value in column b at row a(b)
        delta = time(b)-time(1); %work out the difference in value from the first column value that is selected
        if(delta>2)
            %Skip first column by 1
            a(1)=a(1)+1; %Increment the counter for column 1
            skip=1; %Return back to the first while loop
        elseif(delta<-2)
            %Skip b'th column by 1
            a(b)=a(b)+1; %Increment the counter for column b
        else
            %Its valid
            if(b==cols) %If at the last column and its valid
                c=c+1; %Increment the match counter
                y(c,:)=time(1:cols); %Set the c'th row of the output to what we've found
                a=a+1; %Move onto next number in column 1
                skip=1; %Start all over
            else %Not at last column yet
                b=b+1;
            end
        end
    end
end

最终结果:

  

05 05 06

     

11 09 10

     

16 17 14

     

20 22 18

     

nan nan nan

答案 1 :(得分:-1)

虽然你说的是有三列值,但它们的行和列没有任何意义。实际上你只有一个数字列表:01,05,00,05,09,06,11,11,10,16,17,14,20,22,18。

然后你订购它们:00,01,05,05,06,09,10,11,11,14,16,17,18,20,22

然后你拿三个并看看它们的距离:00,01,05 =坏,01和05相距太远。 下一个号码。 01,05,05?不。下一个号码。 05,05,06?是。继续他们。 09,10,11?是。继续他们。 11,14,16?不。下一个号码。 14,16,17?是。你找到了一个解决方案:

05, 05, 06
09, 10, 11
14, 16, 17