開発環境
- OS X Mavericks - Apple (OS)
- Dart Editor (開発環境)
- Dartium | Dart/ Structured web apps (ブラウザ, Dart VM 用 (Chromium with the Dart VM))
- Safari (ブラウザ, JavaScript 用)
- Dart (プログラミング言語)
初めてのコンピュータサイエンス(Jennifer Campbell、Paul Gries、Jason Montojo、Greg Wilson(著)長尾 高弘(翻訳))の11章(探索とソート)、11.7(練習問題)、11-1.をDartで解いてみる。
その他参考書籍
- What is Dart? [Kindle版] (O'Reilly Media) Kathy Walrath Seth Ladd (著) このブログでの感想
11.7(練習問題)、11-1.
コード
sample.dart
import 'dart:html'; import 'dart:math' as math; void main() { InputElement input1 = querySelector('#t0'); InputElement input2 = querySelector('#t1'); InputElement run = querySelector('#run_dart'); InputElement clear = querySelector('#clear'); Element pre = querySelector('#pre0'); math.Random random = new math.Random(); run.onClick.listen((MouseEvent event){ String result = '${window.navigator.userAgent}\n'; int n = int.parse(input1.value); int m = int.parse(input2.value); List<int> sequence = new List.generate(n, (int index) => random.nextInt(n)); result += '線形探索、二分探索、比率(線形探索/二分探索)\n'; List temp = new List.generate(m, (int index) => index); int start = new DateTime.now().millisecondsSinceEpoch; for(var x in temp){ linearSearch(x, sequence); } int t1 = new DateTime.now().millisecondsSinceEpoch - start; start = new DateTime.now().millisecondsSinceEpoch; List<int> sequence1 = mergeSort(sequence); for(var x in temp){ binSearch(x, sequence1); } int t2 = new DateTime.now().millisecondsSinceEpoch - start; result += '$t1, $t2, ${t1 / t2}\n'; pre.text = result; }); clear.onClick.listen((MouseEvent event) => pre.text = ''); } int linearSearch(var x, List l){ int i; int max = l.length; for (i = 0; i < max; i += 1){ if (l[i] == x){ return i; } } return -1; } int binSearch(var x, List l){ int i = 0; int j = l.length - 1; while (i != j + 1){ int m = (i + j) ~/ 2; if(l[m] < x){ i = m + 1; } else { j = m - 1; } } if (0 <= i && i < l.length && l[i] == x){ return i; } else { return -1; } } List mergeSort(List<int> sequence){ List workspace = []; for(int i in new List.generate(sequence.length, (int index) => index)){ workspace.add([sequence[i]]); } int i = 0; while(i < workspace.length - 1){ List l1 = workspace[i]; List l2 = workspace[i + 1]; List new_l = merge(l1, l2); workspace.add(new_l); i += 2; } return workspace.last; } List merge(List l1, List l2){ List new_l = []; int i1 = 0; int i2 = 0; while (i1 != l1.length && i2 != l2.length){ if(l1[i1] <= l2[i2]){ new_l.add(l1[i1]); i1 += 1; } else { new_l.add(l2[i2]); i2 += 1; } } new_l.addAll(l1.sublist(i1)); new_l.addAll(l2.sublist(i2)); return new_l; }
0 コメント:
コメントを投稿