File tree Expand file tree Collapse file tree 1 file changed +59
-0
lines changed Expand file tree Collapse file tree 1 file changed +59
-0
lines changed Original file line number Diff line number Diff line change
1
+ function getTimeComplexity ( fn ) {
2
+ let loopCount = 0 ;
3
+ let recurseCount = 0 ;
4
+
5
+ function countLoops ( node ) {
6
+ if ( node . type === 'WhileStatement' || node . type === 'ForStatement' || node . type === 'DoWhileStatement' ) {
7
+ loopCount ++ ;
8
+ }
9
+ if ( node . body ) {
10
+ if ( Array . isArray ( node . body ) ) {
11
+ node . body . forEach ( countLoops ) ;
12
+ } else {
13
+ countLoops ( node . body ) ;
14
+ }
15
+ }
16
+ }
17
+
18
+ function countRecurses ( node ) {
19
+ if ( node . type === 'CallExpression' && node . callee . name === fn . name ) {
20
+ recurseCount ++ ;
21
+ }
22
+ if ( node . arguments ) {
23
+ node . arguments . forEach ( countRecurses ) ;
24
+ }
25
+ if ( node . body ) {
26
+ if ( Array . isArray ( node . body ) ) {
27
+ node . body . forEach ( countRecurses ) ;
28
+ } else {
29
+ countRecurses ( node . body ) ;
30
+ }
31
+ }
32
+ }
33
+
34
+ const ast = esprima . parseScript ( fn . toString ( ) ) ;
35
+ console . log ( 'AST:' , ast ) ;
36
+ countLoops ( ast ) ;
37
+ countRecurses ( ast ) ;
38
+ console . log ( 'Loop count:' , loopCount ) ;
39
+ console . log ( 'Recursion count:' , recurseCount ) ;
40
+
41
+ if ( recurseCount > 0 ) {
42
+ console . log ( 'Time complexity: Exponential' ) ;
43
+ return 'Exponential' ;
44
+ } else if ( loopCount > 0 ) {
45
+ if ( loopCount === 1 ) {
46
+ console . log ( 'Time complexity: Linear' ) ;
47
+ return 'Linear' ;
48
+ } else if ( loopCount === 2 ) {
49
+ console . log ( 'Time complexity: Quadratic' ) ;
50
+ return 'Quadratic' ;
51
+ } else {
52
+ console . log ( 'Time complexity: Polynomial' ) ;
53
+ return 'Polynomial' ;
54
+ }
55
+ } else {
56
+ console . log ( 'Time complexity: Constant' ) ;
57
+ return 'Constant' ;
58
+ }
59
+ }
You can’t perform that action at this time.
0 commit comments