ホームページ >バックエンド開発 >PHPチュートリアル >アルゴリズムを聞いてください! !
既存の範囲があります: $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 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;
实在是看不懂·
不知道啊