ホームページ >バックエンド開発 >PHPチュートリアル >アルゴリズムを聞いてください! !

アルゴリズムを聞いてください! !

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-23 14:24:27912ブラウズ

既存の範囲があります: $start--$end (例: 5--10)。
変数 $param を与えます:
If $param If $param>$end , then $param=$end
if else、三項、その他の論理アルゴリズムは必要ありません (ただし、シンプルで効率的です)
この要件を達成するための数学的アルゴリズムを探しています


ディスカッションに返信(解決策)

理解できません

このアルゴリズムは存在しません(比較を使用しません)。言語では、ビット操作の高速化については考えません。

たとえ存在するとしても、2 つの乗算と 1 つの除算が含まれている必要があります。この時間は if - else に相当します。

つまり、それは存在しません。

例: 5--10 (x-y)
a=x-z
b=y-z

aは0より大きく、bは0より大きいため、判定番号は1(z)
とする。したがって、z=x=5となります。


判定番号が 11(z) だとします
a は 0 未満であり、b は 0 未満であるためです。したがって、z=y=10となります。


判定番号が 6(z) であるとします
a は 0 より小さく、b は 0 より大きいためです。それでうまくいきません。


痛いです

or とヘテロモジュラー丸めのさまざまな組み合わせを試しましたが、本当に答えが得られません
このアルゴリズムを実装する可能性について議論しましょう

投稿者はアルゴリズムを求めましたが、これは実際には存在しません= _=...

このアルゴリズムは存在しません (比較を使用しません)。インタープリタ型言語の場合、ビット演算によって速度が向上するとは考えてはいけません。

たとえ存在するとしても、2 つの乗算と 1 つの除算が含まれている必要があります。この時間は if - else に相当します。

つまり、それは存在しません。

公式自体はおそらく存在します。判断はできません
ただし、実際には非常に高速な公式はありません。私が推測したところ、乗算/除算演算を使用する必要があることがわかりました。

なぜ私の 4 階が飲み込まれたのでしょうか

私も計算を色々組み合わせてみましたが、結果は得られませんでした
実装の可能性について議論しましょう

導出過程を調べてください
計算式自体はおそらく存在します。判断はできません
ただし、実際には非常に高速な公式はありません。私が推測したところ、乗算/除算演算を使用する必要があることがわかりました。

x = 5 (y x = y (y は区間 [5,10] 内にあります)
x = 10 (y >= 10)
---------- --------------------------------------------------
オーナー 座標図を描きます。これは基本的に稲妻の形をした曲線に相当します (下の図)。幾何学を勉強したとき、このような曲線方程式を見たことはありません。 。
| ?

a,b E [5,10]
x=a+1;
and aede9494c87828db4b8471354fc8a2fff= 10)
------------------------------------------------------------
楼主画个坐标图,基本相当于闪电模样的一个曲线(下图),学几何的时候没见过这种曲线方程。。
  |  
  |
  |
  /(10)
  /
 /
|(5)
|
|
|
|

如9楼所言,如果楼主要的是数学算法的话,这种
                          ?? ?? ?? ?? ?? ?? ??
                         /
                        /
                       /
                      /
                     /
?? ?? ?? ?? ?? ?? ??
类似的函数曲线还真是没见过啊,
只能是分段函数了,分为三段,这样貌似就得用if else了。

额- -我的图怎么变成这样子了。。。。
那个曲线就是类似于Z的Y轴对称图形,这样子应该只能是分段函数了吧?因为它一点也不圆滑是有死角的
引用 9 楼 foolbirdflyfirst 的回复:

x = 5 (y 29438f96439c3d9cbc49f602d33e0255= 10)
------------------------------------------------------------
楼主画个坐标图,基本相当于闪电模样的一个曲线(下图),学几何的时候没见过这种曲线方程。。
|
|
……

public static int get(int start, int end, int param)        {            param -= start;            param &= (int)(((uint)param) >> 31) - 1;            param += start;            param -= end;            param &= (int)((((uint)param) >> 31) ^ 1) - 1;            return param += end;        }        public static int get1(int start, int end, int param)        {            return new int[] { end, param, start, start }[(((uint)(param - start) >> 30) & 2) | ((uint)(param - end) >> 31)];        }

用符号位只能算正数,否则要将int扩展到long

不知道这个是不是楼主想要的。

int foo(int start, int end, int param){	int tmp[2];	tmp[0] = param;		tmp[1] = start;	param = tmp[(param-start)>>(sizeof(int)*8-1)];	tmp[1] = end;	param = tmp[(end-param)>>(sizeof(int)*8-1)];	return param;}

param = ((start+end)-abs(start-end))/2, 其中abs()为取绝对值运算。

param = (abs(param-start)-abs(param-end)+start+end)/2;

实在是看不懂·

不知道啊

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。