ブログ更新停止のお知らせ
テーマ:総合この度このブログを更新停止をすることにしました。
さまざまなソーシャルツールが増えている中であまりマメじゃない性格上いろなツールを使いこなせないので、Facebookを通じて皆さまと接点を持ってまいりたいとおもっております。
実際最近はほとんど更新しておらず、ご迷惑をおかけしておりました。
ひとまず、バックアップもかねて今までのエントリーは残しておく予定です。
これからもよろしくお願いいたします!
うちのモバイル名人が、あるキャンペーンでくじのようなものを実装していた。
重みランダム選択にしたいという話をしていたのを聞いて、なんとなく気になったのでググってみた。
「重みをつけてランダムに選択する方法」というブログを発見。
記事の最後に参照しているが、「Aのdを二回読みより Bのdの一回読みの方が効率よい」というロジックを紹介していて、その1回読みのアルゴリズム自体はとても面白いと感じたが、本当にパフォーマンスが高いか疑問を感じて整理してみた。
実測しみたところ結果はやっぱり逆だった。
1000件程度のデータから重みをつけてランダムに選択する場合はAのほうが1.5倍程度効率よかった。
まず確かにループの回数は、Aは1.5倍程度Bより多い。
Aは1回目のループは1000回、2回目のループは平均500回まわる。
Bはループが1000回まわる。
ところがループ内の一回ごとのコストをざっくり測定すると以下のとおり。
Aの一回目のループ:13(秒/1000万回)
Aの二回目のループ:16(秒/1000万回)
Bのループ:64(秒/1000万回)
乱数発生処理は処理コストが高く、ループ内で呼び出さないほうがいいのだろう。
簡単にAよりもパフォーマンスを上げたければ、Aのループ処理を分解して、重みの合計値計算は1回のみ実行し、その値を使いまわすのがいい。実際のこの処理方法はAの2倍、Bの4倍のパフォーマンスがでた。
まとめると、当たり前のことだがパフォーマンスの改善に大事なこと。
(1) ある一点の最適化ではなくすべてのの処理を一つ一つのコストを見極めること
(2)とにかく実データを使いベンチマークすること。
「重みをつけてランダムに選択する方法」
http://ameblo.jp/316228/entry-10510330311.htmlA
def choice(d): s = 0 for k, v in d.items(): s += v rnd = random.randrange(s) for k, v in d.items(): s += v if rand < s: return kB
def choice(d): s = 0 for k, v in d.items(): s += v if random.randrange(s) < v: n = k return n
簡単なコンパイラを作る用事があり、手作業で字句・構文・意味解析をするか、コンパイラコンパイラを使うか検討してみた。
JavaCCはあんまりイケていないと常々思っていて、今までは同様なケースの場合は、手作業で書いていただが、イケてるコンパイラコンパイラ(SableCC)を発見。
いけてる点は以下。
sablecc-4.0-beta2をさっそく使ってみた。
ところが、公式サイトでもネットでもほとんど3.xか2.xの情報。かつ構文定義の構文が3.0と4.0でかな~り違う。
ということで、誰かの役に立つかもしれないので、作ったサンプルを公開してみる。
Excelの計算式のようなことができる行計算言語の実装
念のため、2.xの情報をお読みの上、以下はお読みください。
http://shylips.at.infoseek.co.jp/2002/seminar/sablecc/
/*
* The grammer of the excel-like caliculation language
*/
Language calc;
Lexer
number = digit+;
ident = alpha (alpha | digit)*;
alpha = 'A'..'Z';
digit = '0'..'9';
blank = ' '+;
mul = '*';
add = '+';
sub = '-';
div = '/';
Token
number, ident, mul, add, div, sub;
Ignored blank;
Parser
expression =
{value:} value |
{add:} expression [op:]add expression |
{mul:} expression [op:]mul expression |
{div:} expression [op:]div expression |
{sub:} expression [op:]sub expression |
{function:} function
;
Priority
Left mul , div;
Left add , sub;
function =
{void:} ident '(' ')' |
{args:} ident '(' args ')';
args = {normal:} expression |
{additional:} expression additional_args;
additional_args = ',' expression | ',' expression additional_args;
value =
{number:} number |
{const:} ident |
{expression:} '(' expression ')' ;
import language_calc.*;
import java.util.*;
public class Interpreter extends Walker
{
private final Stack<Object> stack = new Stack<Object>();
private final Map<String,Integer> consts = new HashMap<String,Integer>();
private final Map<String,Function> functions = new HashMap<String,Function>();
/**
* Add Demo constant variables and functions.
*/
public Interpreter() {
consts.put("ZERO", 0);
consts.put("ONE", 1);
consts.put("TWO", 2);
consts.put("THREE",3);
functions.put("SUM",new Sum());
functions.put("AVG",new Avg());
}
public void calc(Node tree)
{
tree.apply(this);
System.out.println("RESULT:" + pop());
}
private void pushFunctionCall(String ident)
{
stack.push(new FunctionCall(ident));
System.out.println("> (function)" + ident);
}
private boolean isFunctionCall()
{
return stack.peek() instanceof FunctionCall;
}
private String popFunctionCall()
{
final String ident = ((FunctionCall)stack.pop()).ident;
System.out.println("< (function)" + ident);
return ident;
}
private void push(int i)
{
stack.push(new Integer(i));
System.out.println("> (int)" + i);
}
private int pop() {
int i = ((Integer)stack.pop());
System.out.println("< (int)" + i);
return i;
}
private void callFunction()
{
ArrayList<Integer> args = new ArrayList<Integer>();
for (;;) {
if (isFunctionCall()) {
String ident = popFunctionCall();
Function function = functions.get(ident);
push(function.function(args));
break;
} else {
args.add(pop());
}
}
}
@Override public void caseFunction_Void(NFunction_Void node)
{
pushFunctionCall(node.get_Ident().getText());
defaultCase(node);
callFunction();
}
@Override public void caseFunction_Args(NFunction_Args node)
{
pushFunctionCall(node.get_Ident().getText());
defaultCase(node);
callFunction();
}
@Override public void caseNumber(NNumber node)
{
defaultCase(node);
push(Integer.parseInt(node.getText()));
}
@Override public void caseValue_Const(NValue_Const node)
{
defaultCase(node);
push(consts.get(node.get_Ident().getText()));
}
@Override public void caseExpression_Add(NExpression_Add node)
{
defaultCase(node);
push(pop() + pop());
}
@Override public void caseExpression_Sub(NExpression_Sub node)
{
defaultCase(node);
final int r = pop();
final int l = pop();
push(l - r);
}
@Override public void caseExpression_Mul(NExpression_Mul node)
{
defaultCase(node);
final int r = pop();
final int l = pop();
push(l * r);
}
@Override public void caseExpression_Div(NExpression_Div node)
{
defaultCase(node);
final int r = pop();
final int l = pop();
push(l / r);
}
@Override public void defaultCase(Node node)
{
System.out.println("CASE" + ts(node));
node.applyOnChildren(this);
}
@Override public void defaultOut(Node node)
{
System.out.println("OUT" + ts(node));
}
@Override public void defaultIn(Node node)
{
System.out.println("IN" + ts(node));
}
public static String ts(final Node node)
{
return "\"" + node.getText() + "\" " + node.getType() + " @(" + node.getLine() + "," + node.getPos() + ")";
}
}
interface Function
{
public int function(List<Integer> args);
}
class Sum implements Function
{
public int function(List<Integer> args)
{
int sum = 0;
for (final int n : args) {
sum += n;
}
return sum;
}
}
class Avg implements Function
{
public int function(List<Integer> args)
{
int sum = 0;
for (final int n : args) {
sum += n;
}
return sum / args.size();
}
}
class FunctionCall
{
public final String ident;
public FunctionCall(final String ident) { this.ident = ident; }
}
3 * (SUM(ONE,TWO,THREE) * AVG(1,2,3))
rmdir /S /Q language_calc
java -jar sablecc.jar -v calc.sablecc
@IF ERRORLEVEL 1 GOTO ERROR
javac *.java
@IF ERRORLEVEL 1 GOTO ERROR
java -cp . Test test.calc
GOTO END
:ERROR
:END
- 1) 技術を教えてくれた師や学んだ情報源を、実の親のように敬い、自らの財産を分け与えて、必要ある時には助ける。
- 2) 技術を学ぼうとするものに対して、彼らが学ばんとすれば報酬なしにこの術を教える。
- 3) 著作や講義その他あらゆる方法で、技術の知識とあわせてこの誓いを分かち与えること。
- 4) 技術により、善たることを実現するように努める。
- 5) 自身の能力と判断に従って、顧客や雇用者の長期および短期的な合法的利益、目的、指示、注文に適う方法を選択し、長期的にも短期的にも害と知る方法を決して選択しない。
- 6) 技術によって、社会やある範囲の人に少なからぬ害になることを、技術者が知っている場合、すべての人々に適切な情報を与え、その人々が危険について合意するかしないかを十分確認できる機会を設け、またその害が避けられるように努める。
- 7) 技術を知らない人に対して、知らないことをいいことに、騙す・誤魔化すようなことはしてはならない。知らない人にでも理解できるような適切な情報を与えるよう努める。
- 8) 自分が知りえた機密情報・個人情報等一切の情報の秘密を遵守する。
- この医術を教えてくれた師を実の親のように敬い、自らの財産を分け与えて、必要ある時には助ける。
- 師の子孫を自身の兄弟のように見て、彼らが学ばんとすれば報酬なしにこの術を教える。
- 著作や講義その他あらゆる方法で、医術の知識を師や自らの息子、また、医の規則に則って誓約で結ばれている弟子達に分かち与え、それ以外の誰にも与えない。
- 自身の能力と判断に従って、患者に利すると思う治療法を選択し、害と知る治療法を決して選択しない。
- 依頼されても人を殺す薬を与えない。
- 同様に婦人を流産させる道具を与えない。
- 生涯を純粋と神聖を貫き、医術を行う。
- 膀胱結石に截石術を施行はせず、それを生業とする者に委せる。
- どんな家を訪れる時もそこの自由人と奴隷の相違を問わず、不正を犯すことなく、医術を行う。
- 医に関するか否かに関わらず、他人の生活についての秘密を遵守する。
http://ja.wikipedia.org/wiki/...
- 指針1.一般の害になることを技術者が知っている場合、そのような方法で行為しない
- 指針2.一般の利益に反する害が避けられる種類のものであれば、それを避けるように努める
- 指針3.技術的な作業によって、ある範囲の人々に少なからぬ危険が及ぶ場合、そのすべての人々に適切な情報を与え、その人々が危険について合意するかしないかを十分確認できる機会を設ける
- 指針4.自分の能力の及ぶかぎり、自分の雇用者や顧客の合法的利益、目的、指示、注文に適うように行為する
CODE SEGMENT
; registers:
; bx is the loop counter from 1 to 100.
; di is the address to writer the output.
START:
org 100h
mov bx 1
mov di VRAM
; ax,dx are used tp 'div'
FZBZ:
mov ax bx
div 15
cmp dx 0
jpnz FZBZ1
SCOPY 8 FIZZBUZZ
jp FZBZE
FZBZ1:
mov ax bx
div 3
cmp dx 0
jpnz FZBZ2
SCOPY 4 FIZZ
jp FZBZE
FZBZ2:
mov ax bx
div 5
cmp dx 0
jpnz FZBZ3
SCOPY 4 BUZZ
jp FZBZE
FZBZ3:
mov ax bx
FZBZ4:
div 10
add dx '0'
mov byte ptr [di] dx
inc di
cmp ax 0
jpnz FZBZ4
FZBZE:
cmp bx 100
jpz EXIT
mov byte ptr [di] ' '
inc di
inc bx
jp FZBZ
EXIT:
int 21h
;
SCOPY MACRO LEN LABEL
mov si LABEL
mov cx LEN
cld
rep movsb
ret
ENDM
CODE ENDS
DATA SEGMENT
FIZZBUZZ db 'FizzBuzz'
FIZZ db 'Fizz'
BUZZ db 'Buzz'
DATA ENDS
: main 1 BEGIN DUP fzbz 1 + DUP 100 = UNTIL ;
: fzbz
DUP DUP
3 mod 0 = IF 1 ELSE 0 ENDIF
swap
5 mod 0 = IF 2 ELSE 0 ENDIF
+
CASE
0 OF . ENDOF
1 OF nip ." Fizz" ENDOF
2 OF nip ." Buzz" ENDOF
3 OF nip ." FizzBuzz" ENDOF
ENDCASE
." "
;
main :- i(1,100).
i(X,E):- X =< E,fb(X),X1 is X + 1,i(X1,E).
fb(X) :- (X mod 15) =:= 0,!,write('FizzBuzz ').
fb(X) :- (X mod 3) =:= 0,!,write('Fizz ').
fb(X) :- (X mod 5) =:= 0,!,write('Buzz ').
fb(X) :- write(X),write(' ').
-- FizzBuzz
module Main where
main = putStrLn (fzbz 10000)
fzbz limit = itr 1
where itr n | n <= limit = (tos n) ++ " " ++ itr (n+1)
| otherwise = "";
tos n | (mod n 3 == 0) && (mod n 5 == 0) = "FizzBuzz"
| mod n 3 == 0 = "Fizz"
| mod n 5 == 0 = "Buzz"
| otherwise = show n
module Main where
main = print (primes 2000)
primes n | n == 1 = []
| n == 2 = [2]
| otherwise = if isprime
then preprimes ++ [n]
else preprimes
where preprimes = primes (n-1)
isprime = itr 0
itr i | (length preprimes) <= i = True
| mod n (preprimes !! i) == 0 = False
| otherwise = itr (i+1)
Amebaおすすめキーワード