【问题标题】:comparing numbers to sort then get median value比较数字进行排序然后得到中值
【发布时间】:2012-01-01 05:18:27
【问题描述】:

使用按位或比较运算符对五个整数进行排序可以通过以下方式实现:首先获取最大的数字,然后是第二大的数字,然后是第三大的数字,依此类推。

这是我获得最高数字的代码:

#include <stdio.h>

int main() {
    int a, b, c, d, e;
    int aa, bb, cc, dd, ee;

    a = 4; b = 2; c = 5; d = 1; e = 3;

    aa = (a > b) ?
         ((a > c) ? ((a > d) ? ((a > e) ? a : e) : ((d > e) ? d : e)) :
                    ((c > d) ? ((c > e) ? c : e) : ((d > e) ? d : e))) :
         ((b > c) ? ((b > d) ? ((b > e) ? b : e) : ((d > e) ? d : e)) :
                    ((c > d) ? ((c > e) ? c : e) : ((d > e) ? d : e)));


    printf("highest: %d\n", aa);
    return 0;
}

我认为使用这种方法可以获得第二、第三、第四和第五高的数字。

有没有其他方法可以使用比较/位运算符获得五个整数的中位数?任何其他组合方法都可能有效。

顺便说一下,我打算用硬件实现这个算法。

在排序中使用组合方法会比使用状态机快。

【问题讨论】:

标签: c sorting combinatorics verilog median


【解决方案1】:

考虑它的一种方法是将 5 个数字之间的 10 个比较操作视为您的二进制输入。然后你有选择:

  1. 绘制 10 输入卡诺图并尽可能简化逻辑。
  2. 构建一个 10 位数字作为表的索引。

有些可能性永远不会发生,所以我确信有一些简化可能。例如,如果 (a>b) 和 (b>c) 则 (a>c) 将始终为真。这将有助于方法 #1 并在方法 #2 中生成错误案例。

【讨论】:

  • 实际上,我将在 25 个数字内实现此方法。对数字 1...25 进行排序,然后得到中位数。用卡诺图做这件事可能非常乏味:-(
  • 好点,但考虑实际使用仍然重要的较小数字制作地图。您可能会获得有用的见解,了解如何在一般情况下简化问题。
  • 感谢您有机会在答案中使用“卡诺”。
【解决方案2】:

五个整数中第三高的数中位数,所以如果你得到第三高的数就可以了。

【讨论】:

    【解决方案3】:

    更新

    我使用排序网络在 Verilog 中进行了组合排序。

    module comparator(
        input [31:0] a_1,
        input [31:0] b_1,
        output reg [31:0] a_0,
        output reg [31:0] b_0
    );
    
        always @(a_1, b_1) begin
            if (a_1 > b_1) begin
                a_0 = a_1;
                b_0 = b_1;
            end
            else begin
                a_0 = b_1;
                b_0 = a_1;
            end
        end
    endmodule
    
    module sorting_test;
        reg [31:0] a, b, c, d, e;
        wire [31:0] aa, bb, cc, dd, ee;
        reg clk;
    
        initial begin
            $dumpfile("sorting.vcd");
            $dumpvars();
            #10 $finish;
        end
    
        initial begin
            clk = 0;
        end
    
        always #1 clk = ~clk;
    
        initial begin
            a = 0;
            b = 0;
            c = 0;
            d = 0;
            e = 0;
    
    
            #1
            a = 4;
            b = 1;
            c = 2;
            d = 5;
            e = 3;
            #1
            a = 1;
            b = 16;
            c = 12;
            d = 14;
            e = 15;
    
            #1
            a = 1;
            b = 4;
            c = 9;
            d = 19;
            e = 2;
    
            #1
            a = 16;
            b = 11;
            c = 12;
            d = 16;
            e = 12;
    
            #1  
            a = 16;
            b = 17;
            c = 11;
            d = 15;
            e = 3;
    
            #1  
            a = 13;
            b = 9;
            c = 2;
            d = 1;
            e = 18;
    
            #1  
            a = 17;
            b = 3;
            c = 8;
            d = 3;
            e = 14;
    
            #1  
            a = 14;
            b = 10;
            c = 9;
            d = 14;
            e = 14;
    
            #1  
            a = 15;
            b = 12;
            c = 13;
            d = 10;
            e = 19;
    
            #1  
            a = 6;
            b = 8;
            c = 7;
            d = 16;
            e = 15;
    
            #1  
            a = 10;
            b = 17;
            c = 18;
            d = 1;
            e = 16;
        end
    
        wire [31:0] a1, b1, c1, d1, b2, c2, d2, e2, a2, b3, c3, d3, b4, c4, d4, e4, a5, b5, c5, d5;
        comparator c1l1( a,  b, a1, b1);
        comparator c2l1( c,  d, c1, d1);
        comparator c1l2(b1, c1, b2, c2);
        comparator c2l2(d1,  e, d2, e2);
        comparator c1l3(a1, b2, a2, b3);
        comparator c2l3(c2, d2, c3, d3);
        comparator c1l4(b3, c3, b4, c4);
        comparator c2l4(d3, e2, d4, e4);
        comparator c1l5(a2, b4, a5, b5);
        comparator c2l6(c4, d4, c5, d5);
    
        assign aa = a5;
        assign bb = b5;
        assign cc = c5;
        assign dd = d5;
        assign ee = e4;
    
    endmodule
    

    @Steve Jessop 感谢您提供信息。

    致 @David Winant 和 @sth 提供想法。 =)

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 2014-11-25
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多