メソッド要素c言語パターンプログラミングlsearch

4130 ワード

本文は个人の见解に属して、后で学ぶ総括に対してで、もし说明が正しくない地方があるならばまた达人に指摘してもらいます~
http://wavelee.info/2013/05/04/c-language-programming-paradigm-lserch/
の意見を打診
    
データシーケンスと検索は、任意の言語プログラムで非常によく見られ、よく使用され、異なるデータタイプの検索を実現する必要があることが多い.データ範囲が比較的小さい場合、センサから採取したデータのようにシーケンスされていないデータ数について、あるデータ数を調べるには、線形検索が一般的に適用されます.整数型データ数の検索には、類似クラスの上の方法を適用して実現できます.
    
 
int lsearch( int key, int array[], int size)

{

    for(int i=0; i<size; i++)

    {

        if(array[i] == key)

        {

             return i;

        }

    }



    return -1;

}

このプログラムでは、注意すべき点は2つあります.1つはsizeof(int)==4のため、ポインタが4バイトにジャンプするたびに、すなわち&array[i+1]-&array[i]の結果が4になる.もう1つはarray[i]==keyであり,各比較バイト数はsizeof(int)である.
線形探索関数がポインタごとに次のホップにジャンプするバイト数と、2つのデータ数をどのように比較するかが一致していることが分かった.したがって,走行パターンプログラミングでは,後の関数のいくつかの数パラメータに加えて,この2つの数パラメータ,および各要素の大きさ,およびどのようにこの2つの要素と比較するかを入力しなければならない.
インプリメンテーション
    
検索する要素keyについては、その大きさを知らないので、この要素の所在地と大きさをlserachに伝える必要があります.また,配列の大きさを調べることで,最大検索回数を知ることができるようにし,反復を行うために各要素の大きさを知る必要がある.
    
方法1:
    
void *lsearch(void *key, void base, int n, int elemSize)

{

	for(int i=0; i<n; i++)

	{

		void *elemAddr = (char *)base + i*elemSize;

		if(memcmp(key,elemAddr,elemSize) == 0)

			return e.emAddr;

	}

	

	return 0;

}

方法2:
    
void *lsearch(void *key, void *base ,int n, int elemSize, 

			int (*cmpfn)(void *,void *))

{

	for(int i=0; i<n; i++)

	{

		void *elemAddr = (char *)base + i*elemSize;

		if(cmpfn(key,elemAddr) == 0)

			return elemAddr;

	}



	return NULL;

}

毎日同じ理屈
生命が荘厳な城だとすれば、生命が青々とした大木だとすれば、生命が飛ぶ海鳥だとすれば.では、信念はあのドームの梁柱で、あの深く刺さった木の根で、あの扇動の翼です.信念がなければ、生命の動力は消えてしまう.信念がなければ、生命の美しさは茫然として西へ行く.(線を引くところで他の言葉を変えることができます)
ここで注意しなければならないのはint(*cmpfn)(void*,void*)には、要素の大きさが伝わっていないことです.これは、lsearchを調整する前に、2つの要素を比較する方法が適切かどうかを知っていたからです.もちろん、この要素は調者で自分で書く必要があります.
単純な例
int cmpfn(void *elem1, void *elem2)

{

    int *ip1 = elem1;

    int *ip2 = elem2;



    return *ip1 - *ip2;

}





void *lsearch(void *key, void *base ,int n, int elemSize,\

		 int (*cmpfn)(void *,void *))

{

    int i=0;

	for( i=0; i<n; i++)

	{

		void *elemAddr = (char *)base + i*elemSize;

		if(cmpfn(key,elemAddr) == 0)

			return elemAddr;

	}



	return NULL;

}



int main()

{

    int array[] = {1,3,5,7,9,11,13,15,17,19};

    int key1 = 13;

    int key2 = 33;

    int *find1 = NULL;

    int *find2 = NULL;



    find1 = lsearch(&key1,array,sizeof(array)/sizeof(int),\

			sizeof(int),cmpfn);

    find2 = lsearch(&key2,array,sizeof(array)/sizeof(int),\

			sizeof(int),cmpfn);



    printf("address of array is:%p
",array); printf("address of find1 is:%p
",find1); printf("address of find2 is:%p
",find2); }

結果:
     方法和元素
この関数は私たちに必要なエネルギーを実現していることがわかります.
以上の2つの方法はいずれもパターン型の線形探索を実現できる.比較方法2と方法1は、2つの方法が実現した効果は同じであり、方法2の効率は、cmpfnを数タイプで書くことを知っているため、方法1は1バイト1バイトの比較しかできないことを示している.効率が低い.
http://wavelee.info/2013/05/04/c-language-programming-paradigm-lserch/
文章が終わったら、プログラマーのジョークの語録を共有します.ジョブズ:どうやって安全にしましょうか.ハッカー:あなたのブラウザは国内のネットバンクをサポートしていますか.アップルは国内のネットゲームをすることができますかジョブズ:......ハッカーはいけません:それでは私はあなたの抜け穴を研究して何をして、私も粉ミルクを買う必要があります!