2016-07-28 43 views
2

我有2個數組,一個是輸入pins names,另一個是他們的actual numbers匹配兩個數組的有效方法

const char *pins[]={"d1","d2","d3","d4","d5","o1","o2","o3","o4"}; 
const int pinsNumbers[9]={1,2,19,4,14,6,12,15,17}; 

當我作爲一個輸入「D3」,我想找到相應的 - 。

  1. 有沒有更有效的方法來保存這些「匹配」?
  2. 如何使用輸入在引腳數組上循環並儘可能高效地找到匹配項?
+3

比什麼更有效的方法?你還沒有實現任何東西。 –

+0

有效的方法來保存它。我也想知道如何以一種好的方式來實現它。 – Curnelious

+4

使用地圖而不是2個數組。 – m0skit0

回答

1

只要上面的數組排序,您就可以使用binary search ...。

+0

在示例中它們顯然不是排序的。 – m0skit0

+0

@ m0skit0:OP可能不關心實際元素的索引,只是映射。 – Groo

+0

@ m0skit0他們在OP的問題中被排序,即使他們不是,OP可以排序他們。 –

3

你可以組織你的數據是這樣來模擬一個C++地圖:

struct My_pair { 
    const char* pin; 
    int number; 
}; 

const My_pair pairs[] = { 
    {"d1", 1}, 
    {"d2", 2}, 
    ... 
}; 
+0

這仍然是'O(N)'。 –

+1

@GillBates但至少數據結構是比OP更少的錯誤傾向。 –

+0

@MichaelWalz公平點,但OP要求一個有效的方法 –

4

如果陣列引腳是有序的(否則你可以使用例如qsort對其進行排序),那麼你可以使用下面的方法,因爲它被示出在示範程序

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int cmp(const void *a, const void *b) 
{ 
    const char *lhs = *(const char **)a; 
    const char *rhs = *(const char **)b; 

    return strcmp(lhs, rhs); 
} 

int main(void) 
{ 
    const char *pins[]  = { "d1", "d2", "d3", "d4", "d5", "o1", "o2", "o3", "o4" }; 
    const int pinsNumbers[] = { 1, 2, 19, 4, 14, 6, 12, 15, 17 }; 

    const char *key = "d3"; 

    const char **p = bsearch(&key, pins, sizeof(pins)/sizeof(*pins), sizeof(const char *), cmp); 

    if (p) printf("%d\n", pinsNumbers[p - pins]); 

    return 0; 
} 

程序輸出是

19 
2

儘可能簡單快捷。如果您將使用兩個連續的符號(例如'a''b') - 您可以計算並檢查它,就像下面代碼中的組內偏移一樣。 Ideone online executable code.

#include <stdio.h> 

#define D1_VAL 1 
#define D2_VAL 2 
#define D3_VAL 19 
#define D4_VAL 4 
#define D5_VAL 14 

#define D_CNT 5 
#define D_OFS 0 

#define O1_VAL 6 
#define O2_VAL 12 
#define O3_VAL 15 
#define O4_VAL 17 

#define O_CNT 4 
#define O_OFS D_CNT 

#define PIN_NUM_CNT  (D_CNT+O_CNT) 
#define PIN_GRP_CNT  2 

enum decode_res_e { 
    DECODE_OK = 0, 
    DECODE_ERR = !DECODE_OK 
}; 

int const pin_num_tab[PIN_NUM_CNT] = { 
    D1_VAL, D2_VAL, D3_VAL, D4_VAL, D5_VAL, 
    O1_VAL, O2_VAL, O3_VAL, O4_VAL, 
}; 

typedef struct { unsigned char chr, ofs, cnt; } pin_grp_t; 

pin_grp_t const pin_grp_tab[2] = { 
    { .chr = 'd', .ofs = D_OFS, .cnt = D_CNT }, 
    { .chr = 'o', .ofs = O_OFS, .cnt = O_CNT }, 
}; 

int pin_to_num(int * num, unsigned char * pin) 
{ 
    unsigned char i = 0, tmp = pin[1] - 0x31; 
    while (i < PIN_GRP_CNT) { 
     if (pin_grp_tab[i].chr == pin[0]) { 
      if (tmp >= pin_grp_tab[i].cnt) break; 
      *num = pin_num_tab[pin_grp_tab[i].ofs + tmp]; 
      return DECODE_OK; 
     } 
     i++; 
    } 
    return DECODE_ERR; 
} 

int main(void) 
{ 
    int num; 
    unsigned char const inp[] = "d3"; 
    printf("\f%s is ",inp); 
    if (pin_to_num(&num,inp) == DECODE_OK) { 
     printf("%d\r\n",num); 
    } else { 
     printf("err\r\n"); 
    } 
    return 0; 
} 
相關問題