├── .gitignore ├── LICENSE ├── README.md ├── cs-build └── pom.xml ├── cs-clrs ├── pom.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── mmnaseri │ │ └── cs │ │ └── clrs │ │ ├── ch02 │ │ ├── s1 │ │ │ ├── BinaryIterativeInsertionSorter.java │ │ │ ├── BinaryRecursiveInsertionSorter.java │ │ │ ├── FasterBinaryIterativeInsertionSorter.java │ │ │ ├── FasterBinaryRecursiveInsertionSorter.java │ │ │ ├── FasterIterativeInsertionSorter.java │ │ │ ├── FasterRecursiveInsertionSorter.java │ │ │ ├── InsertionSortUtils.java │ │ │ ├── InsertionSorter.java │ │ │ ├── IterativeInsertionSorter.java │ │ │ └── RecursiveInsertionSorter.java │ │ ├── s2 │ │ │ └── SelectionSorter.java │ │ ├── s3 │ │ │ ├── BinarySearchFinder.java │ │ │ ├── InPlaceMergeSorter.java │ │ │ ├── LinearFinder.java │ │ │ ├── MergeSorter.java │ │ │ ├── Pair.java │ │ │ └── PairSumFinder.java │ │ └── sp │ │ │ ├── BruteForceInversionCounter.java │ │ │ ├── BubbleSorter.java │ │ │ ├── HornerPolynomialCalculator.java │ │ │ ├── InsertionMergeSorter.java │ │ │ ├── InversionCounter.java │ │ │ └── MergeInversionCounter.java │ │ ├── ch04 │ │ ├── s1 │ │ │ ├── BruteForceMaximumSubArrayFinder.java │ │ │ ├── LinearMaximumSubArrayFinder.java │ │ │ ├── MaximumSubArrayFinder.java │ │ │ ├── RecursiveMaximumSubArrayFinder.java │ │ │ └── SubArray.java │ │ └── s2 │ │ │ ├── MatrixMultiplier.java │ │ │ ├── RecursiveMatrixMultiplier.java │ │ │ └── SimpleMatrixMultiplier.java │ │ ├── ch05 │ │ ├── custom │ │ │ ├── ShellSorter.java │ │ │ └── StoogeSorter.java │ │ └── s3 │ │ │ ├── InPlacePermuter.java │ │ │ ├── PermuterSampler.java │ │ │ ├── RandomSampler.java │ │ │ └── SortingPermuter.java │ │ ├── ch06 │ │ ├── s1 │ │ │ └── ArrayHeap.java │ │ └── s4 │ │ │ └── HeapSorter.java │ │ ├── ch07 │ │ ├── QuickSortUtils.java │ │ ├── s1 │ │ │ └── QuickSorter.java │ │ ├── s3 │ │ │ └── RandomizedQuickSorter.java │ │ └── sp │ │ │ └── HoareQuickSorter.java │ │ ├── ch08 │ │ ├── custom │ │ │ └── NonReferencingCountingSorter.java │ │ ├── s2 │ │ │ └── CountingSorter.java │ │ ├── s3 │ │ │ └── RadixSorter.java │ │ └── s4 │ │ │ └── BucketSorter.java │ │ ├── ch09 │ │ ├── SelectionUtils.java │ │ ├── Selector.java │ │ ├── custom │ │ │ └── SortingSelector.java │ │ ├── s2 │ │ │ └── RandomizedSelector.java │ │ ├── s3 │ │ │ └── LinearSelector.java │ │ └── sp │ │ │ └── BestCaseQuickSorter.java │ │ ├── ch10 │ │ ├── s1 │ │ │ ├── FixedSizeQueue.java │ │ │ └── FixedSizeStack.java │ │ ├── s2 │ │ │ ├── DoublyLinkedList.java │ │ │ ├── LinkedList.java │ │ │ └── SinglyLinkedList.java │ │ └── s4 │ │ │ ├── TreeNode.java │ │ │ └── impl │ │ │ ├── BinaryTreeNode.java │ │ │ ├── LevelLinkedTreeNode.java │ │ │ └── SimpleTreeNode.java │ │ ├── ch11 │ │ ├── HashCalculator.java │ │ ├── HashTable.java │ │ ├── HashTableProbe.java │ │ ├── s1 │ │ │ └── DirectAddressingHashTable.java │ │ ├── s2 │ │ │ └── ChainingHashTable.java │ │ ├── s3 │ │ │ ├── DivisionHashCalculator.java │ │ │ └── MultiplicationHashCalculator.java │ │ ├── s4 │ │ │ └── LinearHashCalculator.java │ │ └── s5 │ │ │ ├── DoubleHashingHashTableProbe.java │ │ │ ├── LinearHashTableProbe.java │ │ │ ├── OpenAddressedHashTable.java │ │ │ └── QuadraticHashTableProbe.java │ │ ├── ch12 │ │ ├── s1 │ │ │ ├── InOrderTreeWalk.java │ │ │ ├── NonRecursiveInOrderTreeWalk.java │ │ │ ├── PostOrderTreeWalk.java │ │ │ ├── PreOrderTreeWalk.java │ │ │ ├── TreeWalk.java │ │ │ └── TreeWalkCallback.java │ │ ├── s2 │ │ │ ├── AbstractBinarySearchTree.java │ │ │ ├── AbstractSearchTree.java │ │ │ ├── SearchTree.java │ │ │ └── TreeNodeFactory.java │ │ ├── s3 │ │ │ ├── BinarySearchTree.java │ │ │ └── SimpleBinarySearchTree.java │ │ ├── s4 │ │ │ └── RandomBinarySearchTreeBuilder.java │ │ └── sp │ │ │ ├── Bit.java │ │ │ ├── BitUtils.java │ │ │ ├── RadixTree.java │ │ │ └── RadixTreeNode.java │ │ ├── ch13 │ │ ├── s1 │ │ │ ├── NodeColor.java │ │ │ └── RedBlackTreeNode.java │ │ ├── s2 │ │ │ └── AbstractRotatingBinarySearchTree.java │ │ ├── s3 │ │ │ ├── MonitoredRedBlackTree.java │ │ │ └── RedBlackTree.java │ │ └── sp │ │ │ ├── AvlTree.java │ │ │ ├── AvlTreeNode.java │ │ │ ├── Treap.java │ │ │ └── TreapNode.java │ │ ├── ch14 │ │ ├── s1 │ │ │ ├── OrderStatisticTree.java │ │ │ └── OrderStatisticTreeNode.java │ │ └── s3 │ │ │ ├── Interval.java │ │ │ ├── IntervalTree.java │ │ │ └── IntervalTreeNode.java │ │ ├── ch15 │ │ ├── s1 │ │ │ ├── BottomUpRodCutter.java │ │ │ ├── MemoizedRodCutter.java │ │ │ ├── PriceFunction.java │ │ │ ├── RodCutter.java │ │ │ └── SimpleRodCutter.java │ │ ├── s2 │ │ │ ├── BottomUpMatrixChainParenthesizer.java │ │ │ ├── MatrixChainParenthesizer.java │ │ │ ├── MatrixParenthesization.java │ │ │ └── SplitSpecification.java │ │ ├── s3 │ │ │ └── RecursiveMatrixChainParenthesizer.java │ │ ├── s4 │ │ │ ├── AbstractLongestAscendingSubSequenceFinder.java │ │ │ ├── BottomUpLongestAscendingSubSequenceFinder.java │ │ │ ├── BottomUpLongestCommonSubSequenceFinder.java │ │ │ ├── BruteForceLongestAscendingSubSequenceFinder.java │ │ │ ├── BruteForceLongestCommonSubSequenceFinder.java │ │ │ ├── LongestAscendingSubSequenceFinder.java │ │ │ ├── LongestCommonSubSequenceFinder.java │ │ │ ├── MemoizedLongestCommonSubSequenceFinder.java │ │ │ └── SequenceUtils.java │ │ ├── s5 │ │ │ ├── BinarySearchTreeSpecification.java │ │ │ ├── BottomUpOptimalBinarySearchTreeSpecifier.java │ │ │ ├── OptimalBinarySearchTreeSpecifier.java │ │ │ └── SplitSpecification.java │ │ └── sp │ │ │ ├── BottomUpEditDistanceCalculator.java │ │ │ ├── BruteForceEditDistanceCalculator.java │ │ │ ├── CostFunction.java │ │ │ ├── EditDistanceCalculator.java │ │ │ ├── EditOperation.java │ │ │ ├── EditOperationType.java │ │ │ └── RecursiveEditDistanceCalculator.java │ │ ├── ch16 │ │ ├── custom │ │ │ ├── AbstractBoundedCache.java │ │ │ ├── AbstractMappingBoundedCache.java │ │ │ ├── ConcurrentBoundedCache.java │ │ │ ├── EvictionPolicy.java │ │ │ ├── SimpleBoundedCache.java │ │ │ └── UnboundedCache.java │ │ ├── s1 │ │ │ ├── Activity.java │ │ │ ├── ActivitySelector.java │ │ │ ├── BottomUpActivitySelector.java │ │ │ ├── BottomUpActivitySelector.md │ │ │ ├── BruteForceActivitySelector.java │ │ │ ├── GreedyActivitySelector.java │ │ │ ├── IndexedActivity.java │ │ │ └── RecursiveActivitySelector.java │ │ ├── s2 │ │ │ └── WholeItemKnapsackFiller.java │ │ └── s3 │ │ │ ├── CharacterCode.java │ │ │ ├── CharacterComponent.java │ │ │ └── HuffmanCodeBuilder.java │ │ ├── ch18 │ │ ├── BTree.md │ │ ├── s1 │ │ │ ├── AbstractBTree.java │ │ │ ├── BTreeNode.java │ │ │ ├── Indexed.java │ │ │ ├── MapStorage.java │ │ │ ├── NodeDefinition.java │ │ │ ├── ReflectiveIndexed.java │ │ │ └── Storage.java │ │ ├── s2 │ │ │ └── ExpandableBTree.java │ │ └── s3 │ │ │ └── BTree.java │ │ ├── ch19 │ │ ├── s1 │ │ │ └── FibonacciHeapNode.java │ │ └── s2 │ │ │ └── FibonacciHeap.java │ │ ├── ch20 │ │ ├── s1 │ │ │ ├── DirectAddressingDynamicSet.java │ │ │ └── FixedSizeDynamicSet.java │ │ └── s3 │ │ │ └── VanEmdeBoasTree.java │ │ ├── ch21 │ │ ├── DisjointSet.java │ │ ├── Element.java │ │ ├── s1 │ │ │ ├── BasicDisjointSet.java │ │ │ └── BasicElement.java │ │ ├── s2 │ │ │ ├── AbstractLinkedDisjointSet.java │ │ │ ├── LinkedElement.java │ │ │ ├── LinkedElementContainer.java │ │ │ ├── SimpleDisjointSet.java │ │ │ ├── SimpleLinkedElement.java │ │ │ ├── SimpleLinkedElementContainer.java │ │ │ ├── WeightedDisjointSet.java │ │ │ ├── WeightedLinkedElement.java │ │ │ └── WeightedLinkedElementContainer.java │ │ └── s3 │ │ │ ├── AbstractForestDisjointSet.java │ │ │ ├── PathCompressingRankedForestDisjointSet.java │ │ │ ├── RankedForestDisjointSet.java │ │ │ ├── RankedTreeElement.java │ │ │ ├── SimpleForestDisjointSet.java │ │ │ ├── SimpleTreeElement.java │ │ │ └── TreeElement.java │ │ ├── ch22 │ │ ├── GraphColor.java │ │ ├── GraphVertexVisitor.java │ │ ├── GraphVertexVisitorAdapter.java │ │ ├── GraphVisitor.java │ │ ├── s1 │ │ │ ├── AbstractGraph.java │ │ │ ├── AdjacencyListGraph.java │ │ │ ├── AdjacencyMatrixGraph.java │ │ │ ├── Edge.java │ │ │ ├── EdgeDetails.java │ │ │ ├── Graph.java │ │ │ ├── GraphDetails.java │ │ │ ├── GraphElement.java │ │ │ ├── GraphUtils.java │ │ │ ├── SimpleEdgeDetails.java │ │ │ ├── SimpleVertexDetails.java │ │ │ ├── Vertex.java │ │ │ └── VertexDetails.java │ │ ├── s2 │ │ │ ├── BreadthFirstGraphVisitor.java │ │ │ └── BreadthFirstGraphVisitor.md │ │ ├── s3 │ │ │ └── DepthFirstGraphVisitor.java │ │ ├── s4 │ │ │ ├── DFSTopologicalSorter.java │ │ │ └── TopologicalSorter.java │ │ └── s5 │ │ │ └── StronglyConnectedComponentFinder.java │ │ ├── ch23 │ │ ├── s1 │ │ │ ├── MutableWeightedEdgeDetails.java │ │ │ └── WeightedEdgeDetails.java │ │ └── s2 │ │ │ ├── KruskalMinimumSpanningTreeFinder.java │ │ │ ├── MinimumSpanningTreeFinder.java │ │ │ └── PrimMinimumSpanningTreeFinder.java │ │ ├── ch24 │ │ ├── SingleSourceShortestPathFinder.java │ │ ├── hw │ │ │ └── TravelingProblem.java │ │ ├── s1 │ │ │ ├── AbstractSingleSourceShortestPathFinder.java │ │ │ └── BellmanFordSingleSourceShortestPathFinder.java │ │ ├── s2 │ │ │ └── DagSingleSourceShortestPathFinder.java │ │ └── s3 │ │ │ └── DijkstraSingleSourceShortestPathFinder.java │ │ ├── ch25 │ │ ├── AllPairsShortestPathFinder.java │ │ ├── ShortestPathMetadata.java │ │ ├── s1 │ │ │ ├── AbstractExtendingAllPairsShortestPathFinder.java │ │ │ ├── BruteForceAllPairsShortestPathFinder.java │ │ │ ├── FasterAllPairsShortestPathFinder.java │ │ │ └── SlowAllPairsShortestPathFinder.java │ │ ├── s2 │ │ │ └── FloydWarshallAllPairsShortestPathFinder.java │ │ └── s3 │ │ │ └── JohnsonAllPairsShortestPathFinder.java │ │ ├── ch26 │ │ ├── s1 │ │ │ ├── FlowEdgeDetails.java │ │ │ ├── MaximumFlowFinder.java │ │ │ └── MutableFlowEdgeDetails.java │ │ ├── s2 │ │ │ ├── AbstractFordFulkersonMaximumFlowFinder.java │ │ │ └── EdmondsKarpMaximumFlowFinder.java │ │ └── s3 │ │ │ ├── BipartiteMatchingFinder.java │ │ │ └── FlowBipartiteMatchingFinder.java │ │ ├── ch27 │ │ ├── s0 │ │ │ ├── Action.java │ │ │ ├── Computation.java │ │ │ ├── ComputationResult.java │ │ │ ├── LoopStep.java │ │ │ ├── Scheduler.java │ │ │ ├── SchedulerFactory.java │ │ │ └── impl │ │ │ │ ├── AbstractParallelScheduler.java │ │ │ │ ├── ActionWorker.java │ │ │ │ ├── ComputationWorker.java │ │ │ │ ├── ContextAwareParallelScheduler.java │ │ │ │ ├── ContextAwareParallelSchedulerFactory.java │ │ │ │ ├── ContextMetadata.java │ │ │ │ ├── NestedSchedulerContext.java │ │ │ │ ├── SchedulerContext.java │ │ │ │ ├── SerialScheduler.java │ │ │ │ ├── SerialSchedulerFactory.java │ │ │ │ ├── SimpleParallelScheduler.java │ │ │ │ ├── SimpleParallelSchedulerFactory.java │ │ │ │ └── SimpleSchedulerContext.java │ │ ├── s1 │ │ │ ├── MatrixVectorMultiplier.java │ │ │ └── ScheduledFibonacci.java │ │ ├── s2 │ │ │ ├── ScheduledRecursiveMatrixMultiplier.java │ │ │ └── ScheduledSimpleMatrixMultiplier.java │ │ └── s3 │ │ │ ├── ScheduledMergeSorter.java │ │ │ └── ScheduledSimpleMergeSorter.java │ │ ├── ch28 │ │ ├── custom │ │ │ ├── DeterminantCalculator.java │ │ │ ├── ElementaryOperation.java │ │ │ ├── ElementaryOperationPerformer.java │ │ │ ├── InvertibleMatrixGenerator.java │ │ │ └── impl │ │ │ │ ├── RecursiveDeterminantCalculator.java │ │ │ │ ├── SimpleInvertibleMatrixGenerator.java │ │ │ │ ├── column │ │ │ │ ├── ColumnAdditionElementaryOperationPerformer.java │ │ │ │ ├── ColumnMultiplicationElementaryOperationPerformer.java │ │ │ │ └── ColumnSwitchElementaryOperationPerformer.java │ │ │ │ ├── operations │ │ │ │ ├── AdditionElementaryOperation.java │ │ │ │ ├── MultiplicationElementaryOperation.java │ │ │ │ └── SwitchElementaryOperation.java │ │ │ │ └── row │ │ │ │ ├── RowAdditionElementaryOperationPerformer.java │ │ │ │ ├── RowMultiplicationElementaryOperationPerformer.java │ │ │ │ └── RowSwitchElementaryOperationPerformer.java │ │ ├── s1 │ │ │ ├── AbstractEquationSystemSolver.java │ │ │ ├── AbstractMatrixDecomposer.java │ │ │ ├── DecompositionEquationSystemSolver.java │ │ │ ├── EquationSystemSolver.java │ │ │ ├── LUMatrixDecomposer.java │ │ │ ├── LUPMatrixDecomposer.java │ │ │ ├── MatrixDecomposer.java │ │ │ ├── MatrixDecomposition.java │ │ │ └── PermutationMatrix.java │ │ └── s2 │ │ │ ├── AbstractMatrixInverter.java │ │ │ ├── DecomposerAgnosticEquationSystemSolver.java │ │ │ ├── EquationSystemMatrixInverter.java │ │ │ └── MatrixInverter.java │ │ ├── ch29 │ │ ├── README.md │ │ └── s1 │ │ │ ├── ConstraintType.java │ │ │ ├── LinearFunction.java │ │ │ ├── LinearProgram.java │ │ │ ├── LinearProgramConstraint.java │ │ │ ├── LinearProgramConverter.java │ │ │ ├── LinearProgramSolver.java │ │ │ ├── dsl │ │ │ ├── ConstraintDefinition.java │ │ │ ├── ConstraintDefinitionConjunction.java │ │ │ ├── ConstraintOffset.java │ │ │ ├── ConstraintValue.java │ │ │ ├── End.java │ │ │ ├── Finalizer.java │ │ │ ├── Maximize.java │ │ │ ├── ObjectiveOffset.java │ │ │ ├── Start.java │ │ │ └── impl │ │ │ │ └── LinearProgramBuilder.java │ │ │ └── impl │ │ │ ├── DefaultLinearFunction.java │ │ │ ├── DefaultLinearProgram.java │ │ │ ├── DefaultLinearProgramConstraint.java │ │ │ ├── LinearFunctionRepresentationConfiguration.java │ │ │ ├── LinearFunctionWriter.java │ │ │ ├── LinearProgramWriter.java │ │ │ ├── SimplexLinearProgramSolver.java │ │ │ ├── SlackLinearProgramConverter.java │ │ │ └── StandardLinearProgramConverter.java │ │ ├── ch32 │ │ ├── s1 │ │ │ ├── AbstractStringMatcher.java │ │ │ ├── NaiveStringMatcher.java │ │ │ └── StringMatcher.java │ │ ├── s2 │ │ │ ├── NaiveRollingHasher.java │ │ │ ├── RabinFingerprintRollingHash.java │ │ │ ├── RabinKarpStringMatcher.java │ │ │ └── RollingHasher.java │ │ ├── s3 │ │ │ ├── FiniteAutomataStringMatcher.java │ │ │ ├── TransitionFunction.java │ │ │ ├── TransitionFunctionFactory.java │ │ │ └── impl │ │ │ │ ├── DefaultTransitionFunctionFactory.java │ │ │ │ └── MapTransitionFunction.java │ │ └── s4 │ │ │ ├── KnuthMorrisPrattStringMatcher.java │ │ │ ├── PrefixFunction.java │ │ │ ├── PrefixFunctionFactory.java │ │ │ └── impl │ │ │ ├── ArrayPrefixFunction.java │ │ │ └── DefaultPrefixFunctionFactory.java │ │ └── common │ │ ├── ArrayUtils.java │ │ ├── Cache.java │ │ ├── DynamicSet.java │ │ ├── Finder.java │ │ ├── Heap.java │ │ ├── HeapProperty.java │ │ ├── Matrix.java │ │ ├── MatrixCell.java │ │ ├── MatrixFactory.java │ │ ├── MatrixRow.java │ │ ├── MatrixUtils.java │ │ ├── MergeableHeap.java │ │ ├── NumberUtils.java │ │ ├── ParameterizedTypeReference.java │ │ ├── Permuter.java │ │ ├── PriorityQueue.java │ │ ├── Sampler.java │ │ ├── Sorter.java │ │ ├── Vector.java │ │ └── impl │ │ ├── AbstractImmutableMatrix.java │ │ ├── AbstractMatrix.java │ │ ├── ArrayMatrix.java │ │ ├── ArrayMatrixFactory.java │ │ ├── ArrayVector.java │ │ ├── DelegatingMatrix.java │ │ ├── IdentityMatrix.java │ │ ├── ImmutableMatrixCell.java │ │ ├── ImmutableMatrixRow.java │ │ ├── MatrixCellIterator.java │ │ ├── MatrixRowIterator.java │ │ ├── MaxHeapProperty.java │ │ ├── MinHeapProperty.java │ │ └── ZeroMatrix.java │ └── test │ └── java │ └── com │ └── mmnaseri │ └── cs │ └── clrs │ ├── ch02 │ ├── s1 │ │ ├── BinaryIterativeInsertionSorterTest.java │ │ ├── BinaryRecursiveInsertionSorterTest.java │ │ ├── FasterBinaryIterativeInsertionSorterTest.java │ │ ├── FasterBinaryRecursiveInsertionSorterTest.java │ │ ├── FasterIterativeInsertionSorterTest.java │ │ ├── FasterRecursiveInsertionSorterTest.java │ │ ├── IterativeInsertionSorterTest.java │ │ └── RecursiveInsertionSorterTest.java │ ├── s2 │ │ └── SelectionSorterTest.java │ ├── s3 │ │ ├── BaseFinderTest.java │ │ ├── BinarySearchFinderTest.java │ │ ├── InPlaceMergeSorterTest.java │ │ ├── LinearFinderTest.java │ │ ├── MergeSorterTest.java │ │ └── PairSumFinderTest.java │ └── sp │ │ ├── BaseInversionCounterTest.java │ │ ├── BruteForceInversionCounterTest.java │ │ ├── BubbleSorterTest.java │ │ ├── HornerPolynomialCalculatorTest.java │ │ ├── InsertionMergeSorterTest.java │ │ └── MergeInversionCounterTest.java │ ├── ch04 │ ├── s1 │ │ ├── BaseMaximumSubArrayFinderTest.java │ │ ├── BruteForceMaximumSubArrayFinderTest.java │ │ ├── LinearMaximumSubArrayFinderTest.java │ │ └── RecursiveMaximumSubArrayFinderTest.java │ └── s2 │ │ ├── RecursiveMatrixMultiplierTest.java │ │ └── SimpleMatrixMultiplierTest.java │ ├── ch05 │ ├── custom │ │ ├── ShellSorterTest.java │ │ └── StoogeSorterTest.java │ └── s3 │ │ └── RandomSamplerTest.java │ ├── ch06 │ ├── s1 │ │ └── ArrayHeapTest.java │ └── s4 │ │ └── HeapSorterTest.java │ ├── ch07 │ ├── s1 │ │ └── QuickSorterTest.java │ ├── s3 │ │ └── RandomizedQuickSorterTest.java │ └── sp │ │ └── HoareQuickSorterTest.java │ ├── ch08 │ ├── custom │ │ └── NonReferencingCountingSorterTest.java │ ├── s2 │ │ └── CountingSorterTest.java │ ├── s3 │ │ └── RadixSorterTest.java │ └── s4 │ │ └── BucketSorterTest.java │ ├── ch09 │ ├── custom │ │ └── SortingSelectorTest.java │ ├── s2 │ │ ├── BaseSelectorTest.java │ │ └── RandomizedSelectorTest.java │ ├── s3 │ │ └── LinearSelectorTest.java │ └── sp │ │ └── BestCaseQuickSorterTest.java │ ├── ch10 │ ├── s1 │ │ ├── FixedSizeQueueTest.java │ │ └── FixedSizeStackTest.java │ ├── s2 │ │ ├── BaseLinkedListTest.java │ │ ├── DoublyLinkedListTest.java │ │ └── SinglyLinkedListTest.java │ └── s4 │ │ └── impl │ │ ├── BinaryTreeNodeTest.java │ │ ├── LevelLinkedTreeNodeTest.java │ │ └── SimpleTreeNodeTest.java │ ├── ch11 │ ├── BaseHashTableTest.java │ ├── s1 │ │ └── DirectAddressingHashTableTest.java │ ├── s2 │ │ ├── BaseLargeKeysHashTableTest.java │ │ └── ChainingHashTableTest.java │ ├── s3 │ │ ├── BaseHashCalculatorTest.java │ │ ├── DivisionHashCalculatorTest.java │ │ └── MultiplicationHashCalculatorTest.java │ ├── s4 │ │ └── LinearHashCalculatorTest.java │ └── s5 │ │ ├── BaseHashTableProbeTest.java │ │ ├── DoubleHashingHashTableProbeTest.java │ │ ├── LinearHashTableProbeTest.java │ │ └── OpenAddressedHashTableTest.java │ ├── ch12 │ ├── s1 │ │ ├── BaseTreeWalkTest.java │ │ ├── InOrderTreeWalkTest.java │ │ ├── NonRecursiveInOrderTreeWalkTest.java │ │ ├── PostOrderTreeWalkTest.java │ │ └── PreOrderTreeWalkTest.java │ ├── s2 │ │ └── AbstractBinarySearchTreeTest.java │ ├── s3 │ │ └── SimpleBinarySearchTreeTest.java │ └── sp │ │ └── RadixTreeTest.java │ ├── ch13 │ ├── s2 │ │ └── AbstractRotatingBinarySearchTreeTest.java │ └── s3 │ │ ├── MonitoredRedBlackTreeTest.java │ │ └── RedBlackTreeTest.java │ ├── ch15 │ ├── s4 │ │ ├── BaseLongestAscendingSubSequenceFinderTest.java │ │ ├── BaseLongestCommonSubSequenceFinderTest.java │ │ ├── BottomUpLongestAscendingSubSequenceFinderTest.java │ │ ├── BottomUpLongestCommonSubSequenceFinderTest.java │ │ ├── BruteForceLongestAscendingSubSequenceFinderTest.java │ │ ├── BruteForceLongestCommonSubSequenceFinderTest.java │ │ └── MemoizedLongestCommonSubSequenceFinderTest.java │ └── sp │ │ ├── BaseEditDistanceCalculatorTest.java │ │ ├── BottomUpEditDistanceCalculatorTest.java │ │ ├── BruteForceEditDistanceCalculatorTest.java │ │ ├── DefaultCostFunction.java │ │ ├── ExpensiveReplacementCostFunction.java │ │ └── RecursiveEditDistanceCalculatorTest.java │ ├── ch16 │ ├── s1 │ │ ├── BaseActivitySelectorTest.java │ │ ├── BottomUpActivitySelectorTest.java │ │ ├── BruteForceActivitySelectorTest.java │ │ ├── GreedyActivitySelectorTest.java │ │ └── RecursiveActivitySelectorTest.java │ └── s2 │ │ └── WholeItemKnapsackFillerTest.java │ ├── ch18 │ ├── BTreeTestTools.java │ ├── s2 │ │ └── ExpandableBTreeTest.java │ └── s3 │ │ └── BTreeTest.java │ ├── ch19 │ └── s2 │ │ └── FibonacciHeapTest.java │ ├── ch20 │ └── s3 │ │ └── VanEmdeBoasTreeTest.java │ ├── ch21 │ ├── s1 │ │ ├── BaseDisjointSetTest.java │ │ └── BasicDisjointSetTest.java │ ├── s2 │ │ ├── SimpleDisjointSetTest.java │ │ └── WeightedDisjointSetTest.java │ └── s3 │ │ ├── PathCompressingRankedForestDisjointSetTest.java │ │ ├── RankedForestDisjointSetTest.java │ │ └── SimpleForestDisjointSetTest.java │ ├── ch22 │ ├── s1 │ │ ├── AdjacencyListGraphTest.java │ │ ├── AdjacencyMatrixGraphTest.java │ │ └── BaseGraphTest.java │ ├── s2 │ │ └── BreadthFirstGraphVisitorTest.java │ ├── s3 │ │ └── DepthFirstGraphVisitorTest.java │ ├── s4 │ │ ├── BaseTopologicalSorterTest.java │ │ └── DFSTopologicalSorterTest.java │ └── s5 │ │ └── StronglyConnectedComponentFinderTest.java │ ├── ch23 │ └── s2 │ │ ├── BaseMinimumSpanningTreeFinderTest.java │ │ ├── KruskalMinimumSpanningTreeFinderTest.java │ │ └── PrimMinimumSpanningTreeFinderTest.java │ ├── ch24 │ ├── BaseSingleSourceShortestPathFinderTest.java │ ├── s1 │ │ └── BellmanFordSingleSourceShortestPathFinderTest.java │ ├── s2 │ │ └── DagSingleSourceShortestPathFinderTest.java │ └── s3 │ │ └── DijkstraSingleSourceShortestPathFinderTest.java │ ├── ch25 │ ├── BaseAllPairsShortestPathFinderTest.java │ ├── s1 │ │ ├── BruteForceAllPairsShortestPathFinderTest.java │ │ ├── FasterAllPairsShortestPathFinderTest.java │ │ └── SlowAllPairsShortestPathFinderTest.java │ ├── s2 │ │ └── FloydWarshallAllPairsShortestPathFinderTest.java │ └── s3 │ │ └── JohnsonAllPairsShortestPathFinderTest.java │ ├── ch26 │ ├── s2 │ │ └── EdmondsKarpMaximumFlowFinderTest.java │ └── s3 │ │ └── FlowBipartiteMatchingFinderTest.java │ ├── ch27 │ ├── s1 │ │ ├── MatrixVectorMultiplierTest.java │ │ └── ScheduledFibonacciTest.java │ ├── s2 │ │ ├── ScheduledRecursiveMatrixMultiplierTest.java │ │ └── ScheduledSimpleMatrixMultiplierTest.java │ └── s3 │ │ ├── AbstractScheduledMergeSorterTest.java │ │ ├── ParallelScheduledMergeSorterTest.java │ │ ├── ParallelScheduledSimpleMergeSorterTest.java │ │ ├── ScheduledSimpleMergeSorterTest.java │ │ ├── SerialScheduledMergeSorterTest.java │ │ └── SerialScheduledSimpleMergeSorterTest.java │ ├── ch28 │ ├── custom │ │ └── impl │ │ │ ├── BaseInvertibleMatrixGeneratorTest.java │ │ │ └── SimpleInvertibleMatrixGeneratorTest.java │ ├── s1 │ │ ├── AbstractEquationSystemSolverTest.java │ │ ├── AbstractMatrixDecomposerTest.java │ │ ├── BaseEquationSystemSolverTest.java │ │ ├── BaseMatrixDecomposerTest.java │ │ ├── DecompositionEquationSystemSolverTest.java │ │ ├── LUMatrixDecomposerTest.java │ │ ├── LUPMatrixDecomposerTest.java │ │ └── PermutationMatrixTest.java │ └── s2 │ │ ├── BaseMatrixInverterTest.java │ │ ├── DecomposerAgnosticEquationSystemSolverTestWithLU.java │ │ ├── DecomposerAgnosticEquationSystemSolverTestWithLUP.java │ │ └── EquationSystemMatrixInverterTest.java │ ├── ch29 │ └── s1 │ │ └── impl │ │ ├── SlackLinearProgramConverterTest.java │ │ └── StandardLinearProgramConverterTest.java │ ├── ch32 │ ├── s1 │ │ ├── BaseStringMatcherTest.java │ │ └── NaiveStringMatcherTest.java │ ├── s2 │ │ ├── BaseRollingHasherTest.java │ │ ├── NaiveRollingHasherTest.java │ │ ├── RabinFingerprintRollingHashTest.java │ │ ├── RabinKarpStringMatcherWithFingerprintHasherTest.java │ │ └── RabinKarpStringMatcherWithNaiveHasherTest.java │ ├── s3 │ │ ├── FiniteAutomataStringMatcherTest.java │ │ └── impl │ │ │ └── DefaultTransitionFunctionFactoryTest.java │ └── s4 │ │ ├── KnuthMorrisPrattStringMatcherTest.java │ │ └── impl │ │ └── DefaultPrefixFunctionFactoryTest.java │ └── common │ ├── BaseHeapTest.java │ ├── BaseSortTest.java │ ├── GraphSamples.java │ ├── TestTools.java │ └── impl │ ├── ArrayMatrixTest.java │ └── DelegatingMatrixTest.java ├── cs-ctci ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── mmnaseri │ └── cs │ └── ctci │ ├── ch01 │ ├── p01 │ │ ├── BruteForceIsUnique.java │ │ ├── HashSetIsUnique.java │ │ ├── IsUnique.java │ │ └── SortingIsUnique.java │ ├── p02 │ │ ├── BruteForceCheckPermutation.java │ │ ├── CheckPermutation.java │ │ └── HashMapCheckPermutation.java │ ├── p03 │ │ ├── OffsettingUrlify.java │ │ └── Urlify.java │ ├── p04 │ │ ├── CountingPalindromeAnagram.java │ │ └── PalindromeAnagram.java │ ├── p05 │ │ ├── OneAway.java │ │ └── RecursiveOneAway.java │ ├── p06 │ │ ├── IterativeStringCompressor.java │ │ └── StringCompressor.java │ ├── p07 │ │ ├── MatrixRotator.java │ │ └── MatrixRotatorImpl.java │ ├── p08 │ │ └── ZeroMatrix.java │ └── p09 │ │ ├── ConcatenatingRotationFinder.java │ │ └── RotationFinder.java │ ├── ch02 │ ├── DefaultSinglyLinkedNode.java │ ├── LinkedNodeBuilder.java │ ├── SinglyLinkedNode.java │ ├── p01 │ │ ├── DuplicateRemover.java │ │ ├── HashingDuplicateRemover.java │ │ └── LookAheadDuplicateRemover.java │ ├── p02 │ │ ├── KthToLastFinder.java │ │ └── KthToLastFinderImpl.java │ ├── p03 │ │ ├── MiddleDeleter.java │ │ └── MiddleDeleterImpl.java │ ├── p04 │ │ ├── ListPartitioner.java │ │ └── LookAheadListPartitioner.java │ └── p05 │ │ ├── ForwardLinkAdder.java │ │ └── LinkAdder.java │ ├── ch08 │ ├── p11 │ │ ├── DenominatorCounter.java │ │ └── RecursiveDenominatorCounter.java │ └── p12 │ │ ├── BoardPrinter.java │ │ ├── QueensPlacer.java │ │ └── QueensPlacerImpl.java │ └── ch16 │ └── p18 │ ├── DynamicPatternMatcher.java │ └── PatternMatcher.java ├── cs-leetcode ├── pom.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── mmnaseri │ │ └── cs │ │ └── leetcode │ │ ├── arrays │ │ ├── BruteForceLargestDivisibleSubsetFinder.java │ │ ├── BruteForceMinimumSizeSubarrayFinder.java │ │ ├── BruteForceSlidingWindowMaximumFinder.java │ │ ├── BstSlidingWindowMaximumFinder.java │ │ ├── DequeSlidingWindowMaximumFinder.java │ │ ├── DuplicateNumberFinder.java │ │ ├── FirstMissingPositive.java │ │ ├── LargestDivisibleSubsetFinder.java │ │ ├── LongestConsecutiveSubSequenceFinder.java │ │ ├── MemoizedLargestDivisibleSubsetFinder.java │ │ ├── MinimumSizeSubarrayFinder.java │ │ ├── SlidingWindowMaximumFinder.java │ │ └── SlidingWindowMinimumSizeSubarrayFinder.java │ │ ├── pointers │ │ ├── AddNumbers.java │ │ ├── BottomUpMemoizedUniquePathsFinder.java │ │ ├── BottomUpObstacleUniquePathsFinder.java │ │ ├── BruteForceObstacleUniquePathsFinder.java │ │ ├── BruteForceUniquePathsFinder.java │ │ ├── MemoizedUniquePathsFinder.java │ │ ├── ObstacleUniquePathsFinder.java │ │ ├── OptimizedBottomUpObstacleUniquePathsFinder.java │ │ └── UniquePathsFinder.java │ │ ├── puzzle │ │ └── PlusSignFinder.java │ │ └── strings │ │ ├── BasicCalculator.java │ │ ├── BruteForceLongestPalindromicSubstringFinder.java │ │ ├── BruteForceLongestSubstringWithDistinctChars.java │ │ ├── BruteForceMinimumWindowSubstringFinder.java │ │ ├── CommentRemover.java │ │ ├── LargestUniqueSubstring.java │ │ ├── LongestPalindromicSubstringFinder.java │ │ ├── LongestSubstringWithDistinctChars.java │ │ ├── MemoizedLongestPalindromicSubstringFinder.java │ │ ├── MiniParser.java │ │ ├── MinimumWindowSubstringFinder.java │ │ ├── SlidingWindowLongestSubstringWithDistinctChars.java │ │ ├── SlidingWindowMinimumWindowSubstringFinder.java │ │ └── ZigzagStringConverter.java │ └── test │ └── java │ └── com │ └── mmnaseri │ └── cs │ └── leetcode │ ├── arrays │ ├── BaseLargestDivisibleSubsetFinderTest.java │ ├── BaseMinimumSizeSubarrayTest.java │ ├── BaseSlidingWindowMaximumTest.java │ ├── BruteForceLargestDivisibleSubsetFinderTest.java │ ├── BruteForceMinimumSizeSubarrayFinderTest.java │ ├── BruteForceSlidingWindowMaximumTest.java │ ├── BstSlidingWindowMaximumFinderTest.java │ ├── DequeSlidingWindowMaximumFinderTest.java │ ├── DuplicateNumberFinderTest.java │ ├── FirstMissingPositiveTest.java │ ├── LongestConsecutiveSubSequenceFinderTest.java │ ├── MemoizedLargestDivisibleSubsetFinderTest.java │ └── SlidingWindowMinimumSizeSubarrayFinderTest.java │ ├── pointers │ ├── AddNumbersTest.java │ ├── BaseObstacleUniquePathsFinderTest.java │ ├── BaseUniquePathsFinderTest.java │ ├── BottomUpMemoizedUniquePathsFinderTest.java │ ├── BottomUpObstacleUniquePathsFinderTest.java │ ├── BruteForceObstacleUniquePathsFinderTest.java │ ├── BruteForceUniquePathsFinderTest.java │ ├── MemoizedUniquePathsFinderTest.java │ └── OptimizedBottomUpObstacleUniquePathsFinderTest.java │ ├── puzzle │ └── PlusSignFinderTest.java │ └── strings │ ├── BaseLongestPalindromicSubstringFinderTest.java │ ├── BaseLongestSubstringWithDistinctCharsTest.java │ ├── BaseMinimumWindowSubstringFinderTest.java │ ├── BasicCalculatorTest.java │ ├── BruteForceLongestPalindromicSubstringFinderTest.java │ ├── BruteForceLongestSubstringWithDistinctCharsTest.java │ ├── BruteForceMinimumWindowSubstringFinderTest.java │ ├── CommentRemoverTest.java │ ├── LargestUniqueSubstringTest.java │ ├── MemoizedLongestPalindromicSubstringFinderTest.java │ ├── MiniParserTest.java │ ├── SlidingWindowLongestSubstringWithDistinctCharsTest.java │ ├── SlidingWindowMinimumWindowSubstringFinderTest.java │ └── ZigzagStringConverterTest.java ├── cs-parent └── pom.xml ├── cs-qa ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── mmnaseri │ └── cs │ └── qa │ ├── annotation │ ├── Complexity.java │ ├── Monitored.java │ ├── Quality.java │ ├── Stage.java │ ├── Test.java │ └── Tests.java │ ├── monitor │ ├── Feature.java │ ├── FeatureController.java │ ├── Monitor.java │ ├── error │ │ └── MonitorFailureException.java │ └── impl │ │ ├── BoundMonitor.java │ │ ├── ControlledFeature.java │ │ ├── DefaultMonitor.java │ │ ├── Failure.java │ │ └── MonitorBuilder.java │ └── testng │ └── DataProvisionUtils.java └── cs-skiena ├── pom.xml └── src ├── main └── java │ └── com │ └── mmnaseri │ └── cs │ └── skiena │ ├── ch02 │ └── s6 │ │ ├── FastPowerCalculator.java │ │ └── PowerCalculator.java │ ├── ch03 │ └── s3 │ │ ├── AbstractBalancedTreeSorter.java │ │ ├── InOrderBalancedTreeSorter.java │ │ ├── MinimumDeleteBalancedTreeSorter.java │ │ └── MinimumSuccessorBalancedTreeSorter.java │ ├── ch04 │ ├── s8 │ │ ├── Merger.java │ │ └── impl │ │ │ ├── ComparingHeapMerger.java │ │ │ ├── HeapMerger.java │ │ │ └── NaiveMerger.java │ └── s9 │ │ ├── ss1 │ │ ├── BinarySearchOccurrenceCounter.java │ │ ├── FinderOccurrenceCounter.java │ │ ├── NaiveOccurrenceCounter.java │ │ └── OccurrenceCounter.java │ │ └── ss2 │ │ ├── BinarySearchPrefixLengthFinder.java │ │ ├── NaivePrefixLengthFinder.java │ │ └── PrefixLengthFinder.java │ ├── ch07 │ └── s1 │ │ ├── BacktrackEventListener.java │ │ ├── BacktrackHandler.java │ │ ├── Backtracker.java │ │ ├── BacktrackingContext.java │ │ ├── PermutationGenerator.java │ │ ├── SubsetGenerator.java │ │ └── impl │ │ ├── BacktrackHandlerWrapper.java │ │ ├── DefaultBacktracker.java │ │ └── DefaultBacktrackingContext.java │ └── ch08 │ ├── s1 │ ├── FibonacciNumberGenerator.java │ ├── MemoizingDynamicFibonacciNumberGenerator.java │ ├── NaiveFibonacciNumberGenerator.java │ └── OnDemandDynamicFibonacciNumberGenerator.java │ └── s6 │ ├── ContextFreeGrammar.java │ ├── GrammarRule.java │ ├── NonTerminalGrammarRule.java │ ├── TerminalGrammarRule.java │ └── impl │ └── DefaultContextFreeGrammar.java └── test └── java └── com └── mmnaseri └── cs └── skiena ├── ch02 └── s6 │ └── FastPowerCalculatorTest.java ├── ch03 └── s3 │ ├── BaseSortTest.java │ ├── InOrderBalancedTreeSorterTest.java │ ├── MinimumDeleteBalancedTreeSorterTest.java │ └── MinimumSuccessorBalancedTreeSorterTest.java └── ch04 ├── s8 └── impl │ ├── BaseMergerTest.java │ ├── ComparingHeapMergerTest.java │ ├── HeapMergerTest.java │ └── NaiveMergerTest.java └── s9 ├── ss1 ├── BaseOccurrenceCounterTest.java ├── BinarySearchOccurrenceCounterTest.java ├── FinderOccurrenceCounterTest.java └── NaiveOccurrenceCounterTest.java └── ss2 ├── BasePrefixLengthFinderTest.java ├── BinarySearchPrefixLengthFinderTest.java └── NaivePrefixLengthFinderTest.java /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch02/s3/InPlaceMergeSorter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.Sorter; 4 | import com.mmnaseri.cs.qa.annotation.Quality; 5 | import com.mmnaseri.cs.qa.annotation.Stage; 6 | 7 | /** 8 | * todo the implementation is non-trivial and should be studied before being attempted 9 | * http://stackoverflow.com/questions/2571049/how-to-sort-in-place-using-the-merge-sort-algorithm 10 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 11 | * @since 1.0 (5/26/15, 3:11 AM) 12 | */ 13 | @Quality(Stage.INCOMPLETE) 14 | public class InPlaceMergeSorter> implements Sorter { 15 | 16 | @Override 17 | public void sort(E[] items) { 18 | throw new UnsupportedOperationException("Not implemented yet"); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch02/sp/InversionCounter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.sp; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/11/15, 1:41 AM) 6 | */ 7 | public interface InversionCounter> { 8 | 9 | /** 10 | * This method will count the number of items which according to some defined ordering are out of place. 11 | * @param items the items 12 | * @return number of "inversions" 13 | */ 14 | @SuppressWarnings("unchecked") 15 | int count(E... items); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch04/s1/MaximumSubArrayFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch04.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/26/15, 1:52 AM) 6 | */ 7 | public interface MaximumSubArrayFinder { 8 | 9 | SubArray find(int... target); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch04/s2/MatrixMultiplier.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch04.s2; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (5/26/15, 10:56 PM) 8 | */ 9 | public interface MatrixMultiplier { 10 | 11 | Matrix multiply(Matrix first, Matrix second); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch05/s3/InPlacePermuter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch05.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.ArrayUtils; 4 | import com.mmnaseri.cs.clrs.common.Permuter; 5 | import com.mmnaseri.cs.qa.annotation.Quality; 6 | import com.mmnaseri.cs.qa.annotation.Stage; 7 | 8 | import java.util.Random; 9 | 10 | /** 11 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 12 | * @since 1.0 (5/27/15, 12:25 AM) 13 | */ 14 | @Quality(Stage.UNTESTED) 15 | public class InPlacePermuter implements Permuter { 16 | 17 | @Override 18 | public void permute(E[] array) { 19 | final Random random = new Random(); 20 | for (int i = 0; i < array.length; i++) { 21 | ArrayUtils.swap(array, i, i + random.nextInt(array.length - i)); 22 | } 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch06/s4/HeapSorter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch06.s4; 2 | 3 | import com.mmnaseri.cs.clrs.common.Heap; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | import com.mmnaseri.cs.qa.annotation.Quality; 6 | import com.mmnaseri.cs.qa.annotation.Stage; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (6/6/15, 3:58 PM) 11 | */ 12 | @Quality(Stage.TESTED) 13 | public class HeapSorter> implements Sorter { 14 | 15 | private final Heap heap; 16 | 17 | public HeapSorter(Heap heap) { 18 | this.heap = heap; 19 | } 20 | 21 | @Override 22 | public void sort(E[] items) { 23 | heap.clear(); 24 | for (E item : items) { 25 | heap.add(item); 26 | } 27 | for (int i = 0; i < items.length; i ++) { 28 | items[i] = heap.pop(); 29 | } 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch07/QuickSortUtils.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch07; 2 | 3 | import com.mmnaseri.cs.clrs.common.ArrayUtils; 4 | 5 | import java.util.Comparator; 6 | 7 | public final class QuickSortUtils { 8 | 9 | private QuickSortUtils() throws IllegalAccessException { 10 | throw new IllegalAccessException("This type shouldn't be instantiated."); 11 | } 12 | 13 | public static > int quickSortPartition( 14 | Comparator comparator, E[] items, int from, int to) { 15 | final E partition = items[to - 1]; 16 | int smaller = from - 1; 17 | int seen = from; 18 | while (seen < to - 1) { 19 | if (comparator.compare(partition, items[seen]) >= 0) { 20 | smaller++; 21 | ArrayUtils.swap(items, smaller, seen); 22 | } 23 | seen++; 24 | } 25 | ArrayUtils.swap(items, smaller + 1, to - 1); 26 | return smaller + 1; 27 | } 28 | 29 | 30 | } 31 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch09/SelectionUtils.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch09; 2 | 3 | import com.mmnaseri.cs.clrs.ch07.QuickSortUtils; 4 | import com.mmnaseri.cs.clrs.common.ArrayUtils; 5 | 6 | import java.util.Comparator; 7 | 8 | public final class SelectionUtils { 9 | 10 | private SelectionUtils() throws IllegalAccessException { 11 | throw new IllegalAccessException("This type shouldn't be instantiated."); 12 | } 13 | 14 | public static > int selectPartition( 15 | Comparator comparator, E[] items, int from, int to, int pivot) { 16 | ArrayUtils.swap(items, pivot, to - 1); 17 | return QuickSortUtils.quickSortPartition(comparator, items, from, to); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch09/Selector.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch09; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/11/15, 5:46 PM) 6 | */ 7 | public interface Selector> { 8 | 9 | @SuppressWarnings("unchecked") 10 | E select(int order, E... items); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch10/s2/LinkedList.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch10.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/12/15, 10:19 PM) 6 | */ 7 | public interface LinkedList { 8 | 9 | int getSize(); 10 | 11 | boolean isEmpty(); 12 | 13 | E get(int index); 14 | 15 | int find(E needle); 16 | 17 | void insert(int index, E item); 18 | 19 | void add(E item); 20 | 21 | void delete(E item); 22 | 23 | void delete(int index); 24 | 25 | } 26 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch10/s4/TreeNode.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch10.s4; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/13/15, 12:21 AM) 8 | */ 9 | public interface TreeNode { 10 | 11 | E getValue(); 12 | 13 | void setValue(E value); 14 | 15 | List> getChildren(); 16 | 17 | int addChild(TreeNode child); 18 | 19 | void deleteChild(int index); 20 | 21 | TreeNode getParent(); 22 | 23 | void setParent(TreeNode parent); 24 | 25 | TreeNode getPreviousSibling(); 26 | 27 | TreeNode getNextSibling(); 28 | 29 | TreeNode getFirstChild(); 30 | 31 | boolean isRoot(); 32 | 33 | boolean isLeaf(); 34 | 35 | } 36 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch11/HashCalculator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/13/15) 6 | */ 7 | public interface HashCalculator { 8 | 9 | int calculate(int index, int capacity); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch11/HashTable.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/13/15) 6 | */ 7 | public interface HashTable { 8 | 9 | E get(int index); 10 | 11 | void put(int index, E item); 12 | 13 | void delete(int index); 14 | 15 | int getSize(); 16 | 17 | boolean isEmpty(); 18 | 19 | int getCapacity(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch11/HashTableProbe.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/14/15, 12:51 AM) 6 | */ 7 | public interface HashTableProbe { 8 | 9 | int probe(int index, int capacity, int sequence); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch11/s3/DivisionHashCalculator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashCalculator; 4 | import com.mmnaseri.cs.qa.annotation.Quality; 5 | import com.mmnaseri.cs.qa.annotation.Stage; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (7/13/15) 10 | */ 11 | @Quality(Stage.TESTED) 12 | public class DivisionHashCalculator implements HashCalculator { 13 | 14 | @Override 15 | public int calculate(int index, int capacity) { 16 | return index % capacity; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch11/s3/MultiplicationHashCalculator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashCalculator; 4 | import com.mmnaseri.cs.qa.annotation.Quality; 5 | import com.mmnaseri.cs.qa.annotation.Stage; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (7/13/15) 10 | */ 11 | @Quality(Stage.TESTED) 12 | public class MultiplicationHashCalculator implements HashCalculator { 13 | 14 | private final double factor; 15 | 16 | public MultiplicationHashCalculator(double factor) { 17 | this.factor = factor; 18 | } 19 | 20 | @Override 21 | public int calculate(int index, int capacity) { 22 | final double multiplied = index * factor; 23 | final double fraction = multiplied - Math.floor(multiplied); 24 | return (int) Math.floor(fraction * capacity); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch11/s5/LinearHashTableProbe.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s5; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashCalculator; 4 | import com.mmnaseri.cs.clrs.ch11.HashTableProbe; 5 | import com.mmnaseri.cs.qa.annotation.Quality; 6 | import com.mmnaseri.cs.qa.annotation.Stage; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/14/15, 12:52 AM) 11 | */ 12 | @Quality(Stage.TESTED) 13 | public class LinearHashTableProbe implements HashTableProbe { 14 | 15 | private final HashCalculator hashCalculator; 16 | 17 | public LinearHashTableProbe(HashCalculator hashCalculator) { 18 | this.hashCalculator = hashCalculator; 19 | } 20 | 21 | @Override 22 | public int probe(int index, int capacity, int sequence) { 23 | return (hashCalculator.calculate(index, capacity) + sequence) % capacity; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch12/s1/TreeWalk.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch12.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch10.s4.TreeNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/15/15, 12:34 PM) 8 | */ 9 | public interface TreeWalk> { 10 | 11 | > C perform(N root, C callback); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch12/s1/TreeWalkCallback.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch12.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch10.s4.TreeNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/15/15, 12:34 PM) 8 | */ 9 | public interface TreeWalkCallback> { 10 | 11 | void apply(N node); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch12/s2/TreeNodeFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch12.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch10.s4.TreeNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/18/15, 8:28 PM) 8 | */ 9 | public interface TreeNodeFactory> { 10 | 11 | N createNode(E value); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch12/s3/SimpleBinarySearchTree.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch12.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch10.s4.impl.BinaryTreeNode; 4 | import com.mmnaseri.cs.clrs.ch12.s2.TreeNodeFactory; 5 | import com.mmnaseri.cs.qa.annotation.Quality; 6 | import com.mmnaseri.cs.qa.annotation.Stage; 7 | 8 | import java.util.Comparator; 9 | 10 | /** 11 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 12 | * @since 1.0 (7/18/15, 9:44 PM) 13 | */ 14 | @Quality(Stage.TESTED) 15 | public class SimpleBinarySearchTree extends BinarySearchTree> { 16 | 17 | public SimpleBinarySearchTree(Comparator comparator) { 18 | super( 19 | comparator, 20 | value -> { 21 | final BinaryTreeNode node = new BinaryTreeNode<>(); 22 | node.setValue(value); 23 | return node; 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch12/sp/Bit.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch12.sp; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/18/15, 10:09 PM) 6 | */ 7 | public enum Bit { 8 | 9 | ZERO(-1, "0"), ONE(1, "1"), NEUTRAL(0, ""); 10 | 11 | private final int value; 12 | private final String representation; 13 | 14 | Bit(int value, String representation) { 15 | this.value = value; 16 | this.representation = representation; 17 | } 18 | 19 | public int getValue() { 20 | return value; 21 | } 22 | 23 | @Override 24 | public String toString() { 25 | return representation; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch12/sp/RadixTreeNode.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch12.sp; 2 | 3 | import com.mmnaseri.cs.clrs.ch10.s4.impl.BinaryTreeNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/18/15, 10:08 PM) 8 | */ 9 | public class RadixTreeNode extends BinaryTreeNode { 10 | 11 | private boolean lastBit; 12 | 13 | public RadixTreeNode() { 14 | lastBit = false; 15 | } 16 | 17 | public void setLastBit(boolean lastBit) { 18 | this.lastBit = lastBit; 19 | } 20 | 21 | public boolean isLastBit() { 22 | return lastBit; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch13/s1/NodeColor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch13.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/19/15, 11:55 PM) 6 | */ 7 | public enum NodeColor { 8 | RED, 9 | BLACK 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s1/PriceFunction.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/20/15, 5:05 AM) 6 | */ 7 | public interface PriceFunction { 8 | 9 | int getPrice(int cutSize); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s1/RodCutter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/20/15, 5:05 AM) 6 | */ 7 | public interface RodCutter { 8 | 9 | Integer cut(Integer rodSize); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s1/SimpleRodCutter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s1; 2 | 3 | import com.mmnaseri.cs.qa.annotation.Quality; 4 | import com.mmnaseri.cs.qa.annotation.Stage; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (7/20/15, 5:06 AM) 9 | */ 10 | @Quality(Stage.UNTESTED) 11 | public class SimpleRodCutter implements RodCutter { 12 | 13 | private final PriceFunction function; 14 | 15 | public SimpleRodCutter(PriceFunction function) { 16 | this.function = function; 17 | } 18 | 19 | @Override 20 | public Integer cut(Integer rodSize) { 21 | if (rodSize == 0) { 22 | return 0; 23 | } 24 | int revenue = Integer.MIN_VALUE; 25 | for (int i = 0; i < rodSize; i++) { 26 | revenue = Math.max(revenue, function.getPrice(i) + cut(rodSize - i)); 27 | } 28 | return revenue; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s2/MatrixChainParenthesizer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/20/15) 6 | */ 7 | public interface MatrixChainParenthesizer { 8 | 9 | MatrixParenthesization parenthesize(int... dimensions); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s4/AbstractLongestAscendingSubSequenceFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | import java.util.Comparator; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/21/15) 8 | */ 9 | public abstract class AbstractLongestAscendingSubSequenceFinder 10 | implements LongestAscendingSubSequenceFinder { 11 | 12 | private final Comparator comparator; 13 | 14 | public AbstractLongestAscendingSubSequenceFinder(Comparator comparator) { 15 | this.comparator = comparator; 16 | } 17 | 18 | protected boolean lessThan(E first, E second) { 19 | return comparator.compare(first, second) < 0; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s4/LongestAscendingSubSequenceFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/21/15) 8 | */ 9 | public interface LongestAscendingSubSequenceFinder { 10 | 11 | List find(List items); 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s4/LongestCommonSubSequenceFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/20/15) 8 | */ 9 | public interface LongestCommonSubSequenceFinder { 10 | 11 | List find(List first, List second); 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s5/BinarySearchTreeSpecification.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s5; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (7/21/15, 9:26 PM) 9 | */ 10 | public class BinarySearchTreeSpecification { 11 | 12 | private final Map> splits = new HashMap<>(); 13 | 14 | public SplitSpecification get(int i, int j) { 15 | if (!splits.containsKey(i)) { 16 | return null; 17 | } 18 | return splits.get(i).get(j); 19 | } 20 | 21 | public void set(int i, int j, SplitSpecification specification) { 22 | if (!splits.containsKey(i)) { 23 | splits.put(i, new HashMap<>()); 24 | } 25 | splits.get(i).put(j, specification); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s5/OptimalBinarySearchTreeSpecifier.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s5; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/21/15, 9:18 PM) 6 | */ 7 | public interface OptimalBinarySearchTreeSpecifier { 8 | 9 | BinarySearchTreeSpecification find(double[] hits, double[] misses); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/s5/SplitSpecification.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s5; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/21/15, 9:19 PM) 6 | */ 7 | public class SplitSpecification { 8 | 9 | private final int root; 10 | private final double expectation; 11 | private final double weight; 12 | 13 | public SplitSpecification(int root, double expectation, double weight) { 14 | this.root = root; 15 | this.expectation = expectation; 16 | this.weight = weight; 17 | } 18 | 19 | public int getRoot() { 20 | return root; 21 | } 22 | 23 | public double getExpectation() { 24 | return expectation; 25 | } 26 | 27 | public double getWeight() { 28 | return weight; 29 | } 30 | 31 | @Override 32 | public String toString() { 33 | return root + "," + expectation; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/sp/CostFunction.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.sp; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/21/15, 9:46 PM) 6 | */ 7 | public interface CostFunction { 8 | 9 | int getCost( 10 | EditOperationType operationType, 11 | String source, 12 | String target, 13 | int sourceIndex, 14 | int targetIndex); 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/sp/EditDistanceCalculator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.sp; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @author Ramin Farhanian (rf.tech@icloud.com) 8 | * @since 1.0 (7/21/15, 9:46 PM) 9 | */ 10 | public interface EditDistanceCalculator { 11 | 12 | List calculate(String source, String target, CostFunction costFunction); 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch15/sp/EditOperationType.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.sp; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/21/15, 9:50 PM) 6 | */ 7 | public enum EditOperationType { 8 | COPY(1, 1), 9 | REPLACE(1, 1), 10 | DELETE(1, 0), 11 | INSERT(0, 1), 12 | TWIDDLE(2, 2); 13 | 14 | private final int source; 15 | private final int target; 16 | 17 | EditOperationType(int source, int target) { 18 | this.source = source; 19 | this.target = target; 20 | } 21 | 22 | public int getSource() { 23 | return source; 24 | } 25 | 26 | public int getTarget() { 27 | return target; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch16/custom/EvictionPolicy.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch16.custom; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/25/15, 1:46 PM) 6 | */ 7 | public enum EvictionPolicy { 8 | LEAST_RECENTLY_USED, 9 | LEAST_FREQUENTLY_USED, 10 | OLDEST_FIRST 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch16/s1/ActivitySelector.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch16.s1; 2 | 3 | import java.util.Set; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/22/15) 8 | */ 9 | public interface ActivitySelector { 10 | 11 | Set select(Activity... activities); 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch16/s3/CharacterCode.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch16.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch12.sp.Bit; 4 | import com.mmnaseri.cs.clrs.ch12.sp.BitUtils; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (7/25/15, 1:26 AM) 9 | */ 10 | public class CharacterCode { 11 | 12 | private final Character character; 13 | private final Bit[] code; 14 | 15 | public CharacterCode(Character character, Bit[] code) { 16 | this.character = character; 17 | this.code = code; 18 | } 19 | 20 | public Character getCharacter() { 21 | return character; 22 | } 23 | 24 | public Bit[] getCode() { 25 | return code; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return getCharacter() + ":" + BitUtils.toString(getCode()); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch18/s1/Indexed.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch18.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/27/15) 6 | */ 7 | public interface Indexed> { 8 | 9 | K getKey(); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch18/s1/ReflectiveIndexed.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch18.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/28/15) 6 | */ 7 | public class ReflectiveIndexed> implements Indexed { 8 | 9 | private final K data; 10 | 11 | public ReflectiveIndexed(K data) { 12 | this.data = data; 13 | } 14 | 15 | @Override 16 | public K getKey() { 17 | return data; 18 | } 19 | 20 | @Override 21 | public String toString() { 22 | return String.valueOf(data); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch18/s1/Storage.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch18.s1; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/28/15) 8 | */ 9 | public interface Storage { 10 | 11 | E read(UUID id, int child); 12 | 13 | void write(UUID id, int index, E value); 14 | 15 | void move(UUID source, int sourceIndex, UUID target, int targetIndex); 16 | 17 | void delete(UUID id, int index); 18 | } 19 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/DisjointSet.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21; 2 | 3 | import java.util.Set; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (8/2/15, 2:50 AM) 8 | */ 9 | @SuppressWarnings("UnusedReturnValue") 10 | public interface DisjointSet, I> { 11 | 12 | E create(I representative); 13 | 14 | E find(E item); 15 | 16 | E union(E first, E second); 17 | 18 | Set elements(E item); 19 | 20 | Set sets(); 21 | } 22 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/Element.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 2:52 AM) 6 | */ 7 | public interface Element { 8 | 9 | E getValue(); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s2/LinkedElementContainer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s2; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (8/2/15, 3:18 AM) 8 | */ 9 | public class LinkedElementContainer, I> { 10 | 11 | private UUID uuid; 12 | private E head; 13 | private E tail; 14 | 15 | public UUID getUuid() { 16 | return uuid; 17 | } 18 | 19 | public void setUuid(UUID uuid) { 20 | this.uuid = uuid; 21 | } 22 | 23 | public E getHead() { 24 | return head; 25 | } 26 | 27 | public void setHead(E head) { 28 | this.head = head; 29 | } 30 | 31 | public E getTail() { 32 | return tail; 33 | } 34 | 35 | public void setTail(E tail) { 36 | this.tail = tail; 37 | } 38 | 39 | public void unlink() { 40 | uuid = null; 41 | head = null; 42 | tail = null; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s2/SimpleLinkedElement.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 3:28 AM) 6 | */ 7 | public class SimpleLinkedElement 8 | extends LinkedElement, I, SimpleLinkedElementContainer> {} 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s2/SimpleLinkedElementContainer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 3:30 AM) 6 | */ 7 | public class SimpleLinkedElementContainer 8 | extends LinkedElementContainer, I> {} 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s2/WeightedLinkedElement.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 3:35 AM) 6 | */ 7 | public class WeightedLinkedElement 8 | extends LinkedElement, I, WeightedLinkedElementContainer> {} 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s2/WeightedLinkedElementContainer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 3:35 AM) 6 | */ 7 | public class WeightedLinkedElementContainer 8 | extends LinkedElementContainer, I> { 9 | 10 | private int weight; 11 | 12 | public int getWeight() { 13 | return weight; 14 | } 15 | 16 | public void setWeight(int weight) { 17 | this.weight = weight; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s3/PathCompressingRankedForestDisjointSet.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s3; 2 | 3 | import com.mmnaseri.cs.qa.annotation.Quality; 4 | import com.mmnaseri.cs.qa.annotation.Stage; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/2/15, 12:03 PM) 9 | */ 10 | @Quality(Stage.TESTED) 11 | public class PathCompressingRankedForestDisjointSet extends RankedForestDisjointSet { 12 | 13 | @Override 14 | public RankedTreeElement find(RankedTreeElement item) { 15 | control(item); 16 | if (!item.isRoot()) { 17 | item.setParent(find(item.getParent())); 18 | return item.getParent(); 19 | } else { 20 | return item; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s3/RankedTreeElement.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s3; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 11:56 AM) 6 | */ 7 | public class RankedTreeElement extends TreeElement> { 8 | 9 | private int rank; 10 | 11 | public int getRank() { 12 | return rank; 13 | } 14 | 15 | public void setRank(int rank) { 16 | this.rank = rank; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s3/SimpleForestDisjointSet.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s3; 2 | 3 | import com.mmnaseri.cs.qa.annotation.Quality; 4 | import com.mmnaseri.cs.qa.annotation.Stage; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/2/15, 11:54 AM) 9 | */ 10 | @Quality(Stage.TESTED) 11 | public class SimpleForestDisjointSet extends AbstractForestDisjointSet, I> { 12 | 13 | @Override 14 | protected SimpleTreeElement newRoot(I representative) { 15 | final SimpleTreeElement element = new SimpleTreeElement<>(); 16 | element.setValue(representative); 17 | return element; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch21/s3/SimpleTreeElement.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s3; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 11:54 AM) 6 | */ 7 | public class SimpleTreeElement extends TreeElement> {} 8 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/GraphColor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/5/15) 6 | */ 7 | public enum GraphColor { 8 | WHITE, 9 | GREY, 10 | BLACK 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/GraphVertexVisitor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.Edge; 4 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 6 | import com.mmnaseri.cs.clrs.ch22.s1.Vertex; 7 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 8 | 9 | /** 10 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 11 | * @since 1.0 (8/2/15, 11:11 PM) 12 | */ 13 | public interface GraphVertexVisitor { 14 | 15 | void beforeExploration(Graph graph, Vertex vertex); 16 | 17 | void afterExploration(Graph graph, Vertex vertex); 18 | 19 | void visitEdge(Graph graph, Edge edge); 20 | } 21 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/GraphVertexVisitorAdapter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.Edge; 4 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 6 | import com.mmnaseri.cs.clrs.ch22.s1.Vertex; 7 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 8 | 9 | /** 10 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 11 | * @since 1.0 (8/3/15) 12 | */ 13 | public abstract class GraphVertexVisitorAdapter 14 | implements GraphVertexVisitor { 15 | @Override 16 | public void beforeExploration(Graph graph, Vertex vertex) {} 17 | 18 | @Override 19 | public void afterExploration(Graph graph, Vertex vertex) {} 20 | 21 | @Override 22 | public void visitEdge(Graph graph, Edge edge) {} 23 | } 24 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/GraphVisitor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 4 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 5 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/2/15, 11:11 PM) 10 | */ 11 | public interface GraphVisitor { 12 | 13 | Graph visit(Graph graph, GraphVertexVisitor visitor); 14 | 15 | Graph visit(Graph graph, int start, GraphVertexVisitor visitor); 16 | } 17 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s1/Edge.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 8:02 PM) 6 | */ 7 | public class Edge extends GraphElement { 8 | 9 | private Vertex from; 10 | private Vertex to; 11 | 12 | public Vertex getFrom() { 13 | return from; 14 | } 15 | 16 | public void setFrom(Vertex from) { 17 | this.from = from; 18 | } 19 | 20 | public Vertex getTo() { 21 | return to; 22 | } 23 | 24 | public void setTo(Vertex to) { 25 | this.to = to; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return from.getIndex() + " -> " + to.getIndex(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s1/EdgeDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 8:26 PM) 6 | */ 7 | public interface EdgeDetails extends GraphDetails {} 8 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s1/GraphDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/13/15) 6 | */ 7 | public interface GraphDetails {} 8 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s1/SimpleEdgeDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/14/15) 6 | */ 7 | @SuppressWarnings("unused") 8 | public class SimpleEdgeDetails implements EdgeDetails {} 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s1/SimpleVertexDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/14/15) 6 | */ 7 | public class SimpleVertexDetails implements VertexDetails {} 8 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s1/Vertex.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 8:02 PM) 6 | */ 7 | public class Vertex extends GraphElement { 8 | 9 | private int index; 10 | 11 | public int getIndex() { 12 | return index; 13 | } 14 | 15 | public void setIndex(int index) { 16 | this.index = index; 17 | } 18 | 19 | @Override 20 | public String toString() { 21 | return String.valueOf(index); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s1/VertexDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 8:28 PM) 6 | */ 7 | public interface VertexDetails extends GraphDetails {} 8 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch22/s4/TopologicalSorter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s4; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 4 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 5 | import com.mmnaseri.cs.clrs.ch22.s1.Vertex; 6 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 12 | * @since 1.0 (8/3/15) 13 | */ 14 | public interface TopologicalSorter { 15 | 16 | List> sort(Graph graph); 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch23/s1/MutableWeightedEdgeDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch23.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/14/15) 6 | */ 7 | public class MutableWeightedEdgeDetails implements WeightedEdgeDetails { 8 | 9 | private int weight; 10 | 11 | @Override 12 | public int getWeight() { 13 | return weight; 14 | } 15 | 16 | public void setWeight(int weight) { 17 | this.weight = weight; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch23/s1/WeightedEdgeDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch23.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (8/5/15) 8 | */ 9 | public interface WeightedEdgeDetails extends EdgeDetails { 10 | 11 | int getWeight(); 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch23/s2/MinimumSpanningTreeFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch23.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 4 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 5 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/5/15) 10 | */ 11 | public interface MinimumSpanningTreeFinder { 12 | 13 | Graph find(Graph graph); 14 | } 15 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch24/SingleSourceShortestPathFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch24; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 4 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 5 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/6/15) 10 | */ 11 | public interface SingleSourceShortestPathFinder< 12 | E extends WeightedEdgeDetails, V extends VertexDetails> { 13 | 14 | Graph find(Graph graph, int start); 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch24/hw/TravelingProblem.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch24.hw; 2 | 3 | public class TravelingProblem { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch25/AllPairsShortestPathFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch25; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 4 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 5 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 6 | import com.mmnaseri.cs.clrs.common.Matrix; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (8/7/15) 11 | */ 12 | public interface AllPairsShortestPathFinder { 13 | 14 | Matrix> find(Graph graph); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch25/ShortestPathMetadata.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch25; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.Vertex; 4 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/9/15, 6:01 PM) 9 | */ 10 | public class ShortestPathMetadata { 11 | 12 | private final int distance; 13 | private final Vertex predecessor; 14 | 15 | public ShortestPathMetadata(int distance, Vertex predecessor) { 16 | this.distance = distance; 17 | this.predecessor = predecessor; 18 | } 19 | 20 | public int getDistance() { 21 | return distance; 22 | } 23 | 24 | public Vertex getPredecessor() { 25 | return predecessor; 26 | } 27 | 28 | @Override 29 | public String toString() { 30 | return String.valueOf(distance); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch26/s1/FlowEdgeDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch26.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (8/26/15) 8 | */ 9 | public interface FlowEdgeDetails extends EdgeDetails { 10 | 11 | int getCapacity(); 12 | 13 | int getFlow(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch26/s1/MaximumFlowFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch26.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 4 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/26/15) 9 | */ 10 | public interface MaximumFlowFinder { 11 | 12 | Graph find(Graph network, int source, int destination); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch26/s1/MutableFlowEdgeDetails.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch26.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/26/15) 6 | */ 7 | public class MutableFlowEdgeDetails implements FlowEdgeDetails { 8 | 9 | private int capacity; 10 | private int flow; 11 | 12 | @Override 13 | public int getCapacity() { 14 | return capacity; 15 | } 16 | 17 | public void setCapacity(int capacity) { 18 | this.capacity = capacity; 19 | } 20 | 21 | @Override 22 | public int getFlow() { 23 | return flow; 24 | } 25 | 26 | public void setFlow(int flow) { 27 | this.flow = flow; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch26/s3/BipartiteMatchingFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch26.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 4 | import com.mmnaseri.cs.clrs.ch22.s1.Graph; 5 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/26/15) 10 | */ 11 | public interface BipartiteMatchingFinder { 12 | 13 | Graph find(Graph bipartiteGraph); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/Action.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public interface Action { 8 | 9 | void perform(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/Computation.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public interface Computation { 8 | 9 | E perform(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/ComputationResult.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public interface ComputationResult { 8 | 9 | E get(); 10 | 11 | boolean done(); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/LoopStep.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public interface LoopStep { 8 | 9 | void perform(int step); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/Scheduler.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public interface Scheduler { 8 | 9 | void spawn(Action action); 10 | 11 | ComputationResult spawn(Computation computation); 12 | 13 | void loop(int from, int to, LoopStep step); 14 | 15 | void sync(); 16 | 17 | void end(); 18 | 19 | void syncAndEnd(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/SchedulerFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public interface SchedulerFactory { 8 | 9 | Scheduler getScheduler(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/ActionWorker.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.Action; 4 | 5 | import java.util.UUID; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (2/27/16) 10 | */ 11 | public class ActionWorker implements Runnable { 12 | 13 | private final SchedulerContext context; 14 | private final Action action; 15 | private final UUID contextId; 16 | 17 | public ActionWorker(SchedulerContext context, Action action) { 18 | this.context = context; 19 | contextId = context.id(); 20 | this.action = action; 21 | } 22 | 23 | @Override 24 | public void run() { 25 | context.increase(contextId); 26 | action.perform(); 27 | context.decrease(contextId); 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/ContextAwareParallelScheduler.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public class ContextAwareParallelScheduler extends AbstractParallelScheduler { 8 | 9 | ContextAwareParallelScheduler() { 10 | super(); 11 | } 12 | 13 | @Override 14 | protected SchedulerContext createSchedulerContext() { 15 | return new NestedSchedulerContext(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/ContextAwareParallelSchedulerFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.Scheduler; 4 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (2/27/16) 9 | */ 10 | public class ContextAwareParallelSchedulerFactory implements SchedulerFactory { 11 | @Override 12 | public Scheduler getScheduler() { 13 | return new ContextAwareParallelScheduler(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/ContextMetadata.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (2016/03/15, 07:53) 6 | */ 7 | interface ContextMetadata { 8 | 9 | int current(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/SchedulerContext.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | import java.util.UUID; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (2016/03/15, 07:46) 8 | */ 9 | public interface SchedulerContext { 10 | 11 | UUID id(); 12 | 13 | void increase(UUID id); 14 | 15 | void decrease(UUID id); 16 | 17 | M freeze(); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/SerialSchedulerFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.Scheduler; 4 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (2/27/16) 9 | */ 10 | public class SerialSchedulerFactory implements SchedulerFactory { 11 | @Override 12 | public Scheduler getScheduler() { 13 | return new SerialScheduler(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/SimpleParallelScheduler.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public class SimpleParallelScheduler extends AbstractParallelScheduler { 8 | 9 | SimpleParallelScheduler() { 10 | super(); 11 | } 12 | 13 | @Override 14 | protected SchedulerContext createSchedulerContext() { 15 | return new SimpleSchedulerContext(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch27/s0/impl/SimpleParallelSchedulerFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s0.impl; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.Scheduler; 4 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 5 | 6 | /** 7 | * @author Milad Naseri (milad.naseri@cdk.com) 8 | * @since 1.0 (2016/03/15, 07:57) 9 | */ 10 | public class SimpleParallelSchedulerFactory implements SchedulerFactory { 11 | 12 | @Override 13 | public Scheduler getScheduler() { 14 | return new SimpleParallelScheduler(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/custom/DeterminantCalculator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.custom; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/30/16, 11:52 AM) 8 | */ 9 | public interface DeterminantCalculator { 10 | 11 | E determinant(Matrix matrix); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/custom/ElementaryOperation.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.custom; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/29/16, 11:45 AM) 6 | */ 7 | public interface ElementaryOperation { 8 | } 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/custom/ElementaryOperationPerformer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.custom; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/29/16, 11:42 AM) 8 | */ 9 | public interface ElementaryOperationPerformer> { 10 | 11 | Class getOperationType(); 12 | 13 | void perform(Matrix matrix, O operation); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/custom/InvertibleMatrixGenerator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.custom; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/29/16, 12:10 PM) 8 | */ 9 | public interface InvertibleMatrixGenerator { 10 | 11 | Matrix generate(int size); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/custom/impl/operations/MultiplicationElementaryOperation.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.custom.impl.operations; 2 | 3 | import com.mmnaseri.cs.clrs.ch28.custom.ElementaryOperation; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/29/16, 11:50 AM) 8 | */ 9 | public class MultiplicationElementaryOperation implements ElementaryOperation { 10 | 11 | private final E constant; 12 | private final int target; 13 | 14 | public MultiplicationElementaryOperation(E constant, int target) { 15 | this.constant = constant; 16 | this.target = target; 17 | } 18 | 19 | public E getConstant() { 20 | return constant; 21 | } 22 | 23 | public int getTarget() { 24 | return target; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/custom/impl/operations/SwitchElementaryOperation.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.custom.impl.operations; 2 | 3 | import com.mmnaseri.cs.clrs.ch28.custom.ElementaryOperation; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/29/16, 11:45 AM) 8 | */ 9 | public class SwitchElementaryOperation implements ElementaryOperation { 10 | 11 | private final int source; 12 | private final int target; 13 | 14 | public SwitchElementaryOperation(int source, int target) { 15 | this.source = source; 16 | this.target = target; 17 | } 18 | 19 | public int getSource() { 20 | return source; 21 | } 22 | 23 | public int getTarget() { 24 | return target; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/s1/EquationSystemSolver.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/28/16, 3:07 PM) 10 | */ 11 | public interface EquationSystemSolver { 12 | 13 | List solve(Matrix coefficients, List values); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/s1/MatrixDecomposer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (8/28/16, 5:36 PM) 8 | */ 9 | public interface MatrixDecomposer { 10 | 11 | MatrixDecomposition decompose(Matrix matrix); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch28/s2/MatrixInverter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.s2; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (8/28/16, 10:24 PM) 8 | */ 9 | public interface MatrixInverter { 10 | 11 | Matrix invert(Matrix original); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/README.md: -------------------------------------------------------------------------------- 1 | Notes 2 | ===== 3 | 4 | Initially, I thought that modelling a linear program as a set of individual constraints and an objective function 5 | was a good idea. 6 | 7 | However, as it turns out, this means that solving the program using the simplex algorithm (or other algorithms for 8 | that matter) becomes exhaustingly difficult. 9 | 10 | It would have been better to model the programs using matrix tuples as suggested by the book (duh). As such, I have 11 | not implemented the rest of this chapter, in hopes of someday coming back and remodelling it appropriately so that 12 | the solution is both easy to implement and easy to understand. -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/ConstraintType.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/30/16, 2:59 PM) 6 | */ 7 | public enum ConstraintType { 8 | 9 | LESS_THAN_OR_EQUAL_TO("<=", "\u2264"), GREATER_THAN_OR_EQUAL_TO(">=", "\u2265"), EQUAL_TO("=", "="); 10 | 11 | private final String representation; 12 | private final String formatted; 13 | 14 | ConstraintType(String representation, String formatted) { 15 | this.representation = representation; 16 | this.formatted = formatted; 17 | } 18 | 19 | public String getRepresentation() { 20 | return representation; 21 | } 22 | 23 | public String getFormatted() { 24 | return formatted; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/LinearFunction.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/30/16, 3:02 PM) 8 | */ 9 | public interface LinearFunction { 10 | 11 | int size(); 12 | 13 | E getCoefficient(int index); 14 | 15 | @SuppressWarnings("unchecked") 16 | E evaluate(E... values); 17 | 18 | List getCoefficients(); 19 | 20 | E getOffset(); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/LinearProgram.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/30/16, 3:08 PM) 8 | */ 9 | public interface LinearProgram { 10 | 11 | int variables(); 12 | 13 | List> getConstraints(); 14 | 15 | LinearFunction getObjective(); 16 | 17 | boolean isSlack(); 18 | 19 | List getBasicVariables(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/LinearProgramConstraint.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/30/16, 2:58 PM) 6 | */ 7 | public interface LinearProgramConstraint extends LinearFunction { 8 | 9 | ConstraintType getConstraintType(); 10 | 11 | E getValue(); 12 | 13 | boolean isSlack(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/LinearProgramConverter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/31/16, 10:38 AM) 6 | */ 7 | public interface LinearProgramConverter { 8 | 9 | LinearProgram convert(LinearProgram original); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/LinearProgramSolver.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (9/7/16, 6:53 PM) 8 | */ 9 | public interface LinearProgramSolver { 10 | 11 | List solve(LinearProgram program); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/ConstraintDefinition.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/31/16, 11:48 AM) 6 | */ 7 | public interface ConstraintDefinition { 8 | 9 | @SuppressWarnings("unchecked") 10 | ConstraintOffset when(E first, E... rest); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/ConstraintDefinitionConjunction.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/31/16, 11:46 AM) 6 | */ 7 | public interface ConstraintDefinitionConjunction extends Finalizer { 8 | 9 | @SuppressWarnings("unchecked") 10 | ConstraintOffset and(E first, E... rest); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/ConstraintOffset.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (9/6/16, 3:18 PM) 6 | */ 7 | public interface ConstraintOffset extends ConstraintValue { 8 | 9 | ConstraintValue offsetBy(E offset); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/ConstraintValue.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/31/16, 11:45 AM) 6 | */ 7 | public interface ConstraintValue { 8 | 9 | ConstraintDefinitionConjunction is(E value); 10 | 11 | ConstraintDefinitionConjunction isGreaterThan(E value); 12 | 13 | ConstraintDefinitionConjunction isLessThan(E value); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/End.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/31/16, 11:42 AM) 6 | */ 7 | public interface End { 8 | } 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/Finalizer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/31/16, 11:43 AM) 6 | */ 7 | public interface Finalizer extends Maximize { 8 | } 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/Maximize.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | import com.mmnaseri.cs.clrs.ch29.s1.LinearProgram; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/31/16, 11:43 AM) 8 | */ 9 | public interface Maximize { 10 | 11 | LinearProgram maximize(); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/ObjectiveOffset.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (9/6/16, 3:16 PM) 6 | */ 7 | public interface ObjectiveOffset extends ConstraintDefinition { 8 | 9 | ConstraintDefinition offsetBy(E offset); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch29/s1/dsl/Start.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch29.s1.dsl; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/31/16, 11:42 AM) 6 | */ 7 | public interface Start extends ObjectiveOffset { 8 | } 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s1/StringMatcher.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/4/16, 6:26 PM) 6 | */ 7 | public interface StringMatcher { 8 | 9 | /** 10 | * Finds all the offsets at which the {@code needle} occurs within the {@code haystack} if there 11 | * are no occurrences 12 | * 13 | * @param needle the string to search for 14 | * @param haystack the string to look at for the occurrences of the needle 15 | * @return all indexes at which the needle can be found 16 | */ 17 | Integer[] indexOf(String needle, String haystack); 18 | } 19 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s2/NaiveRollingHasher.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s2; 2 | 3 | import java.math.BigInteger; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/4/16, 7:10 PM) 8 | */ 9 | public class NaiveRollingHasher implements RollingHasher { 10 | 11 | @Override 12 | public BigInteger hash(String text) { 13 | BigInteger code = BigInteger.valueOf(0); 14 | for (int i = 0; i < text.length(); i++) { 15 | code = code.add(BigInteger.valueOf(text.charAt(i))); 16 | } 17 | return code; 18 | } 19 | 20 | @Override 21 | public BigInteger roll(String text, BigInteger hash, char next) { 22 | return hash.subtract(BigInteger.valueOf(text.charAt(0))).add(BigInteger.valueOf(next)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s2/RollingHasher.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s2; 2 | 3 | import java.math.BigInteger; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/4/16, 7:09 PM) 8 | */ 9 | public interface RollingHasher { 10 | 11 | BigInteger hash(String text); 12 | 13 | BigInteger roll(String text, BigInteger hash, char next); 14 | } 15 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s3/TransitionFunction.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s3; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/5/16, 2:02 PM) 6 | */ 7 | public interface TransitionFunction { 8 | 9 | int transition(int state, char next); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s3/TransitionFunctionFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s3; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/5/16, 2:09 PM) 6 | */ 7 | public interface TransitionFunctionFactory { 8 | 9 | TransitionFunction getInstance(String pattern); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s4/PrefixFunction.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s4; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/6/16, 11:16 AM) 6 | */ 7 | public interface PrefixFunction { 8 | 9 | int prefix(int index); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s4/PrefixFunctionFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s4; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/6/16, 11:18 AM) 6 | */ 7 | public interface PrefixFunctionFactory { 8 | 9 | PrefixFunction getInstance(String pattern); 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/ch32/s4/impl/ArrayPrefixFunction.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s4.impl; 2 | 3 | import com.mmnaseri.cs.clrs.ch32.s4.PrefixFunction; 4 | import com.mmnaseri.cs.qa.annotation.Quality; 5 | import com.mmnaseri.cs.qa.annotation.Stage; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (11/6/16, 11:17 AM) 10 | */ 11 | @Quality(Stage.TESTED) 12 | public class ArrayPrefixFunction implements PrefixFunction { 13 | 14 | private final int[] lengths; 15 | 16 | public ArrayPrefixFunction(int[] lengths) { 17 | this.lengths = lengths; 18 | } 19 | 20 | @Override 21 | public int prefix(int index) { 22 | return lengths[index]; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Cache.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/25/15, 1:42 PM) 6 | */ 7 | public interface Cache { 8 | 9 | boolean contains(K key); 10 | 11 | V get(K key); 12 | 13 | void put(K key, V value); 14 | 15 | boolean evict(K key); 16 | 17 | int size(); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/DynamicSet.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | import com.mmnaseri.cs.clrs.ch18.s1.Indexed; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (8/1/15, 2:48 PM) 8 | */ 9 | public interface DynamicSet> { 10 | 11 | int size(); 12 | 13 | boolean isEmpty(); 14 | 15 | I find(Integer key); 16 | 17 | void add(I value); 18 | 19 | void delete(Integer index); 20 | 21 | I minimum(); 22 | 23 | I maximum(); 24 | 25 | I successor(Integer key); 26 | 27 | I predecessor(Integer key); 28 | 29 | } 30 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Finder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/26/15, 3:14 AM) 6 | */ 7 | public interface Finder { 8 | 9 | @SuppressWarnings("unchecked") 10 | int find(E needle, E... items); 11 | 12 | } 13 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Heap.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (6/6/15, 3:17 PM) 6 | */ 7 | public interface Heap> { 8 | 9 | void clear(); 10 | 11 | E peek(); 12 | 13 | E pop(); 14 | 15 | int size(); 16 | 17 | void add(E item); 18 | 19 | boolean isEmpty(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/HeapProperty.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | import java.util.Comparator; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (6/6/15, 3:51 PM) 8 | */ 9 | public interface HeapProperty extends Comparator { 10 | } 11 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Matrix.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/26/15, 10:55 PM) 6 | */ 7 | public interface Matrix extends Iterable> { 8 | 9 | int getRows(); 10 | 11 | int getColumns(); 12 | 13 | E get(int row, int col); 14 | 15 | void set(int row, int col, E value); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/MatrixCell.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/26/15, 11:12 PM) 6 | */ 7 | public interface MatrixCell { 8 | 9 | int getRowNumber(); 10 | 11 | int getColumnNumber(); 12 | 13 | E getValue(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/MatrixFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/26/15, 11:16 PM) 6 | */ 7 | public interface MatrixFactory { 8 | 9 | Matrix getMatrix(int rows, int columns); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/MatrixRow.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/26/15, 11:11 PM) 6 | */ 7 | public interface MatrixRow extends Iterable> { 8 | 9 | int getRowNumber(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/MergeableHeap.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/31/15, 10:02 PM) 6 | */ 7 | public interface MergeableHeap> extends Heap { 8 | 9 | void merge(Heap heap); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/ParameterizedTypeReference.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/3/15) 6 | */ 7 | public abstract class ParameterizedTypeReference { 8 | } 9 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Permuter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/27/15, 12:13 AM) 6 | */ 7 | public interface Permuter { 8 | 9 | void permute(E[] array); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/PriorityQueue.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/2/15, 11:43 AM) 6 | */ 7 | public interface PriorityQueue> extends Heap { 8 | 9 | E get(int index); 10 | 11 | int change(int index, E newValue); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Sampler.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (5/27/15, 12:32 AM) 6 | */ 7 | public interface Sampler { 8 | 9 | E[] sample(E[] array, int size); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Sorter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * This interface represents the common problem of sorting a number of items with the only assumption being that 5 | * some sort of comparison can be made between individual items of the array 6 | * 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (5/26/15, 2:19 AM) 9 | */ 10 | public interface Sorter> { 11 | 12 | /** 13 | * @param items the items to be sorted 14 | */ 15 | void sort(E[] items); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/Vector.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (2/27/16) 6 | */ 7 | public interface Vector extends Iterable { 8 | 9 | E get(int index); 10 | 11 | void set(int index, E value); 12 | 13 | int size(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/impl/AbstractImmutableMatrix.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common.impl; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/28/16, 4:13 PM) 6 | */ 7 | public abstract class AbstractImmutableMatrix extends AbstractMatrix { 8 | 9 | @Override 10 | protected void write(int row, int col, E value) { 11 | throw new UnsupportedOperationException(); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/impl/ArrayMatrixFactory.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common.impl; 2 | 3 | import com.mmnaseri.cs.clrs.common.Matrix; 4 | import com.mmnaseri.cs.clrs.common.MatrixFactory; 5 | import com.mmnaseri.cs.qa.annotation.Quality; 6 | import com.mmnaseri.cs.qa.annotation.Stage; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (5/26/15, 11:17 PM) 11 | */ 12 | @Quality(Stage.UNTESTED) 13 | public class ArrayMatrixFactory implements MatrixFactory { 14 | 15 | @Override 16 | public Matrix getMatrix(int rows, int columns) { 17 | return new ArrayMatrix<>(rows, columns); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/impl/MaxHeapProperty.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common.impl; 2 | 3 | import com.mmnaseri.cs.clrs.common.HeapProperty; 4 | import com.mmnaseri.cs.qa.annotation.Quality; 5 | import com.mmnaseri.cs.qa.annotation.Stage; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (6/6/15, 3:51 PM) 10 | */ 11 | @Quality(Stage.UNTESTED) 12 | public class MaxHeapProperty> implements HeapProperty { 13 | 14 | @Override 15 | public int compare(E first, E second) { 16 | return second.compareTo(first); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/main/java/com/mmnaseri/cs/clrs/common/impl/MinHeapProperty.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.common.impl; 2 | 3 | import com.mmnaseri.cs.clrs.common.HeapProperty; 4 | import com.mmnaseri.cs.qa.annotation.Quality; 5 | import com.mmnaseri.cs.qa.annotation.Stage; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (6/6/15, 3:51 PM) 10 | */ 11 | @Quality(Stage.UNTESTED) 12 | public class MinHeapProperty> implements HeapProperty { 13 | 14 | @Override 15 | public int compare(E first, E second) { 16 | return first.compareTo(second); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/BinaryIterativeInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/13/15) 9 | */ 10 | public class BinaryIterativeInsertionSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new BinaryIterativeInsertionSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/BinaryRecursiveInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/27/15) 9 | */ 10 | public class BinaryRecursiveInsertionSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new BinaryRecursiveInsertionSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/FasterBinaryIterativeInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/13/15) 9 | */ 10 | public class FasterBinaryIterativeInsertionSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new FasterBinaryIterativeInsertionSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/FasterBinaryRecursiveInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/27/15) 9 | */ 10 | public class FasterBinaryRecursiveInsertionSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new FasterBinaryRecursiveInsertionSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/FasterIterativeInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/13/15) 9 | */ 10 | public class FasterIterativeInsertionSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new FasterIterativeInsertionSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/FasterRecursiveInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/27/15) 9 | */ 10 | public class FasterRecursiveInsertionSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new FasterRecursiveInsertionSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/IterativeInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class IterativeInsertionSorterTest extends BaseSortTest { 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new IterativeInsertionSorter<>(NATURAL_COMPARATOR); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s1/RecursiveInsertionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/27/15) 9 | */ 10 | public class RecursiveInsertionSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new RecursiveInsertionSorter<>(NATURAL_COMPARATOR); 15 | } 16 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s2/SelectionSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s2; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class SelectionSorterTest extends BaseSortTest { 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new SelectionSorter<>(NATURAL_COMPARATOR); 11 | } 12 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s3/BinarySearchFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.Finder; 4 | 5 | public class BinarySearchFinderTest extends BaseFinderTest { 6 | 7 | @Override 8 | protected Finder getFinder() { 9 | return new BinarySearchFinder<>(); 10 | } 11 | 12 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s3/InPlaceMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s3; 2 | 3 | public class InPlaceMergeSorterTest { 4 | 5 | 6 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s3/LinearFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.Finder; 4 | 5 | public class LinearFinderTest extends BaseFinderTest { 6 | 7 | @Override 8 | protected Finder getFinder() { 9 | return new LinearFinder<>(); 10 | } 11 | 12 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/s3/MergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class MergeSorterTest extends BaseSortTest { 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new MergeSorter<>(NATURAL_COMPARATOR); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/sp/BruteForceInversionCounterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.sp; 2 | 3 | public class BruteForceInversionCounterTest extends BaseInversionCounterTest { 4 | 5 | @Override 6 | protected InversionCounter getCounter() { 7 | return new BruteForceInversionCounter<>(NATURAL_ORDER); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/sp/BubbleSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.sp; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class BubbleSorterTest extends BaseSortTest { 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new BubbleSorter<>(NATURAL_COMPARATOR); 11 | } 12 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/sp/InsertionMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.sp; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class InsertionMergeSorterTest extends BaseSortTest { 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new InsertionMergeSorter<>(NATURAL_COMPARATOR); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch02/sp/MergeInversionCounterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch02.sp; 2 | 3 | public class MergeInversionCounterTest extends BaseInversionCounterTest { 4 | 5 | @Override 6 | protected InversionCounter getCounter() { 7 | return new MergeInversionCounter<>(NATURAL_ORDER); 8 | } 9 | 10 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch04/s1/BruteForceMaximumSubArrayFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch04.s1; 2 | 3 | public class BruteForceMaximumSubArrayFinderTest extends BaseMaximumSubArrayFinderTest { 4 | 5 | @Override 6 | protected MaximumSubArrayFinder getFinder() { 7 | return new BruteForceMaximumSubArrayFinder(); 8 | } 9 | 10 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch04/s1/LinearMaximumSubArrayFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch04.s1; 2 | 3 | public class LinearMaximumSubArrayFinderTest extends BaseMaximumSubArrayFinderTest { 4 | 5 | @Override 6 | protected MaximumSubArrayFinder getFinder() { 7 | return new LinearMaximumSubArrayFinder(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch04/s1/RecursiveMaximumSubArrayFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch04.s1; 2 | 3 | public class RecursiveMaximumSubArrayFinderTest extends BaseMaximumSubArrayFinderTest { 4 | 5 | @Override 6 | protected MaximumSubArrayFinder getFinder() { 7 | return new RecursiveMaximumSubArrayFinder(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch05/custom/ShellSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch05.custom; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Milad Naseri (milad.naseri@cdk.com) 8 | * @since 1.0 (9/2/16, 2:55 PM) 9 | */ 10 | public class ShellSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new ShellSorter<>(NATURAL_COMPARATOR, new int[]{701, 301, 132, 57, 23, 10, 4, 1}); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch05/custom/StoogeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch05.custom; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Milad Naseri (milad.naseri@cdk.com) 8 | * @since 1.0 (9/2/16, 2:40 PM) 9 | */ 10 | public class StoogeSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new StoogeSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch06/s4/HeapSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch06.s4; 2 | 3 | import com.mmnaseri.cs.clrs.ch06.s1.ArrayHeap; 4 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 5 | import com.mmnaseri.cs.clrs.common.Sorter; 6 | import com.mmnaseri.cs.clrs.common.impl.MinHeapProperty; 7 | 8 | public class HeapSorterTest extends BaseSortTest { 9 | 10 | @Override 11 | protected Sorter getAscendingSorter() { 12 | return new HeapSorter<>(new ArrayHeap<>(new MinHeapProperty())); 13 | } 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch07/s1/QuickSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch07.s1; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class QuickSorterTest extends BaseSortTest { 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new QuickSorter<>(NATURAL_COMPARATOR); 11 | } 12 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch07/s3/RandomizedQuickSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch07.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | import org.testng.annotations.Test; 6 | 7 | public class RandomizedQuickSorterTest extends BaseSortTest { 8 | 9 | @Override 10 | protected Sorter getAscendingSorter() { 11 | return new RandomizedQuickSorter<>(NATURAL_COMPARATOR); 12 | } 13 | 14 | @Override 15 | @Test(dataProvider = "normalDataProvider", invocationCount = 100) 16 | public void testSortIntegrity(Integer[] items) throws Exception { 17 | super.testSortIntegrity(items); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch07/sp/HoareQuickSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch07.sp; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class HoareQuickSorterTest extends BaseSortTest{ 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new HoareQuickSorter<>(NATURAL_COMPARATOR); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch08/custom/NonReferencingCountingSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch08.custom; 2 | 3 | import com.mmnaseri.cs.clrs.ch08.s2.CountingSorterTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | public class NonReferencingCountingSorterTest extends CountingSorterTest { 7 | 8 | @Override 9 | protected Sorter getAscendingSorter() { 10 | return new NonReferencingCountingSorter(NATURAL_COMPARATOR); 11 | } 12 | 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch08/s2/CountingSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch08.s2; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | import org.testng.annotations.Test; 6 | 7 | public class CountingSorterTest extends BaseSortTest { 8 | 9 | @Override 10 | protected Sorter getAscendingSorter() { 11 | return new CountingSorter(NATURAL_COMPARATOR); 12 | } 13 | 14 | //counting sort assumes the maximum item to be a finite, small number 15 | @Override 16 | @Test(enabled = false) 17 | public void testAscendingSortWithInfinity() throws Exception { 18 | super.testAscendingSortWithInfinity(); 19 | } 20 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch09/custom/SortingSelectorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch09.custom; 2 | 3 | import com.mmnaseri.cs.clrs.ch02.s1.IterativeInsertionSorter; 4 | import com.mmnaseri.cs.clrs.ch09.Selector; 5 | import com.mmnaseri.cs.clrs.ch09.s2.BaseSelectorTest; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (7/11/15, 6:13 PM) 10 | */ 11 | public class SortingSelectorTest extends BaseSelectorTest { 12 | 13 | @Override 14 | protected Selector getSelector() { 15 | return new SortingSelector<>(new IterativeInsertionSorter<>(NATURAL_ORDER)); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch09/s2/RandomizedSelectorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch09.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch09.Selector; 4 | import org.testng.annotations.Test; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (7/11/15, 5:55 PM) 9 | */ 10 | public class RandomizedSelectorTest extends BaseSelectorTest { 11 | 12 | @Override 13 | protected Selector getSelector() { 14 | return new RandomizedSelector<>(NATURAL_ORDER); 15 | } 16 | 17 | @Override 18 | @Test(invocationCount = 50, dataProvider = "normalDataProvider") 19 | public void testSelectorIntegrity(Integer[] data, int order, Integer expectation) throws Exception { 20 | super.testSelectorIntegrity(data, order, expectation); 21 | } 22 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch09/s3/LinearSelectorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch09.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch09.Selector; 4 | import com.mmnaseri.cs.clrs.ch09.s2.BaseSelectorTest; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (7/12/15, 7:50 PM) 9 | */ 10 | public class LinearSelectorTest extends BaseSelectorTest { 11 | 12 | @Override 13 | protected Selector getSelector() { 14 | return new LinearSelector<>(NATURAL_ORDER); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch09/sp/BestCaseQuickSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch09.sp; 2 | 3 | import com.mmnaseri.cs.clrs.common.BaseSortTest; 4 | import com.mmnaseri.cs.clrs.common.Sorter; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (7/12/15, 9:08 PM) 9 | */ 10 | public class BestCaseQuickSorterTest extends BaseSortTest { 11 | 12 | @Override 13 | protected Sorter getAscendingSorter() { 14 | return new BestCaseQuickSorter<>(NATURAL_COMPARATOR); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch10/s2/DoublyLinkedListTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch10.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/12/15, 11:57 PM) 6 | */ 7 | public class DoublyLinkedListTest extends BaseLinkedListTest { 8 | 9 | @Override 10 | protected LinkedList getLinkedList() { 11 | return new DoublyLinkedList<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch10/s2/SinglyLinkedListTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch10.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/12/15, 11:21 PM) 6 | */ 7 | public class SinglyLinkedListTest extends BaseLinkedListTest { 8 | 9 | @Override 10 | protected LinkedList getLinkedList() { 11 | return new SinglyLinkedList<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch11/s1/DirectAddressingHashTableTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashTable; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/13/15) 8 | */ 9 | public class DirectAddressingHashTableTest extends com.mmnaseri.cs.clrs.ch11.BaseHashTableTest { 10 | 11 | @Override 12 | protected HashTable[] getHashTables() { 13 | //noinspection unchecked 14 | return new HashTable[]{new DirectAddressingHashTable<>(10)}; 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch11/s2/ChainingHashTableTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashTable; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/13/15) 8 | */ 9 | public class ChainingHashTableTest extends BaseLargeKeysHashTableTest { 10 | 11 | @Override 12 | protected HashTable[] getHashTables() { 13 | //noinspection unchecked 14 | return new HashTable[]{new ChainingHashTable<>(10)}; 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch11/s3/DivisionHashCalculatorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashCalculator; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/13/15) 8 | */ 9 | public class DivisionHashCalculatorTest extends BaseHashCalculatorTest { 10 | 11 | @Override 12 | protected HashCalculator[] getHashCalculators() { 13 | return new HashCalculator[]{new DivisionHashCalculator()}; 14 | } 15 | 16 | @Override 17 | protected int[] getCapacities() { 18 | return new int[]{701}; 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch11/s3/MultiplicationHashCalculatorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashCalculator; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/13/15) 8 | */ 9 | public class MultiplicationHashCalculatorTest extends BaseHashCalculatorTest { 10 | 11 | public static final double PHI = 0.6180339887; 12 | 13 | @Override 14 | protected HashCalculator[] getHashCalculators() { 15 | return new HashCalculator[]{ 16 | new MultiplicationHashCalculator(PHI), 17 | new MultiplicationHashCalculator(Math.PI), 18 | new MultiplicationHashCalculator(Math.E), 19 | }; 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch11/s4/LinearHashCalculatorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s4; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashCalculator; 4 | import com.mmnaseri.cs.clrs.ch11.s3.BaseHashCalculatorTest; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (7/13/15) 9 | */ 10 | public class LinearHashCalculatorTest extends BaseHashCalculatorTest { 11 | 12 | @Override 13 | protected HashCalculator[] getHashCalculators() { 14 | return new HashCalculator[]{new LinearHashCalculator(29, 7, 23)}; 15 | } 16 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch11/s5/DoubleHashingHashTableProbeTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s5; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashTableProbe; 4 | import com.mmnaseri.cs.clrs.ch11.s3.DivisionHashCalculator; 5 | import com.mmnaseri.cs.clrs.ch11.s3.MultiplicationHashCalculator; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (7/15/15, 12:34 AM) 10 | */ 11 | public class DoubleHashingHashTableProbeTest extends BaseHashTableProbeTest { 12 | 13 | @Override 14 | protected HashTableProbe[] getProbes() { 15 | return new HashTableProbe[]{ 16 | new DoubleHashingHashTableProbe(new DivisionHashCalculator(), new MultiplicationHashCalculator(Math.E)) 17 | }; 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch11/s5/LinearHashTableProbeTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch11.s5; 2 | 3 | import com.mmnaseri.cs.clrs.ch11.HashTableProbe; 4 | import com.mmnaseri.cs.clrs.ch11.s3.DivisionHashCalculator; 5 | import com.mmnaseri.cs.clrs.ch11.s3.MultiplicationHashCalculator; 6 | import com.mmnaseri.cs.clrs.ch11.s4.LinearHashCalculator; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/14/15, 1:32 AM) 11 | */ 12 | public class LinearHashTableProbeTest extends BaseHashTableProbeTest { 13 | 14 | @Override 15 | protected HashTableProbe[] getProbes() { 16 | return new HashTableProbe[]{ 17 | new LinearHashTableProbe(new DivisionHashCalculator()), 18 | new LinearHashTableProbe(new MultiplicationHashCalculator(Math.E)), 19 | new LinearHashTableProbe(new LinearHashCalculator(13, 7, 3)) 20 | }; 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch12/s1/NonRecursiveInOrderTreeWalkTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch12.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch10.s4.impl.BinaryTreeNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/15/15, 2:49 PM) 8 | */ 9 | public class NonRecursiveInOrderTreeWalkTest extends InOrderTreeWalkTest { 10 | 11 | @Override 12 | protected TreeWalk> getTreeWalk() { 13 | return new NonRecursiveInOrderTreeWalk<>(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/s4/BottomUpLongestAscendingSubSequenceFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/22/15) 6 | */ 7 | public class BottomUpLongestAscendingSubSequenceFinderTest extends BaseLongestAscendingSubSequenceFinderTest { 8 | 9 | @Override 10 | protected LongestAscendingSubSequenceFinder getFinder() { 11 | return new BottomUpLongestAscendingSubSequenceFinder<>(NATURAL_ORDER); 12 | } 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/s4/BottomUpLongestCommonSubSequenceFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/21/15) 6 | */ 7 | public class BottomUpLongestCommonSubSequenceFinderTest extends BaseLongestCommonSubSequenceFinderTest { 8 | 9 | @Override 10 | protected LongestCommonSubSequenceFinder getFinder() { 11 | return new BottomUpLongestCommonSubSequenceFinder<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/s4/BruteForceLongestAscendingSubSequenceFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/21/15) 6 | */ 7 | public class BruteForceLongestAscendingSubSequenceFinderTest extends BaseLongestAscendingSubSequenceFinderTest { 8 | 9 | @Override 10 | protected LongestAscendingSubSequenceFinder getFinder() { 11 | return new BruteForceLongestAscendingSubSequenceFinder<>(NATURAL_ORDER); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/s4/BruteForceLongestCommonSubSequenceFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/20/15) 6 | */ 7 | public class BruteForceLongestCommonSubSequenceFinderTest extends BaseLongestCommonSubSequenceFinderTest { 8 | 9 | @Override 10 | protected LongestCommonSubSequenceFinder getFinder() { 11 | return new BruteForceLongestCommonSubSequenceFinder<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/s4/MemoizedLongestCommonSubSequenceFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.s4; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/21/15) 6 | */ 7 | public class MemoizedLongestCommonSubSequenceFinderTest extends BaseLongestCommonSubSequenceFinderTest { 8 | 9 | @Override 10 | protected LongestCommonSubSequenceFinder getFinder() { 11 | return new MemoizedLongestCommonSubSequenceFinder<>(); 12 | } 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/sp/BottomUpEditDistanceCalculatorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.sp; 2 | 3 | /** 4 | * @author Ramin Farhanian (rf.tech@icloud.com) 5 | * @since 1.0 (09/10/2018) 6 | */ 7 | public class BottomUpEditDistanceCalculatorTest extends BaseEditDistanceCalculatorTest { 8 | 9 | protected EditDistanceCalculator getEditDistanceCalculator() { 10 | return new BottomUpEditDistanceCalculator(); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/sp/BruteForceEditDistanceCalculatorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.sp; 2 | 3 | /** 4 | * @author Ramin Farhanian (rf.tech@icloud.com) 5 | * @since 1.0 (04/10/2018) 6 | */ 7 | public class BruteForceEditDistanceCalculatorTest extends BaseEditDistanceCalculatorTest { 8 | 9 | protected EditDistanceCalculator getEditDistanceCalculator() { 10 | return new BruteForceEditDistanceCalculator(); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch15/sp/RecursiveEditDistanceCalculatorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch15.sp; 2 | 3 | /** 4 | * @author Ramin Farhanian (rf.tech@icloud.com) 5 | * @since 1.0 (08/10/2018) 6 | */ 7 | public class RecursiveEditDistanceCalculatorTest extends BaseEditDistanceCalculatorTest { 8 | 9 | protected EditDistanceCalculator getEditDistanceCalculator() { 10 | return new RecursiveEditDistanceCalculator(); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch16/s1/BottomUpActivitySelectorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch16.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/23/15) 6 | */ 7 | public class BottomUpActivitySelectorTest extends BaseActivitySelectorTest { 8 | 9 | @Override 10 | protected ActivitySelector getActivitySelector() { 11 | return new BottomUpActivitySelector(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch16/s1/BruteForceActivitySelectorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch16.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/22/15) 6 | */ 7 | public class BruteForceActivitySelectorTest extends BaseActivitySelectorTest { 8 | 9 | @Override 10 | protected ActivitySelector getActivitySelector() { 11 | return new BruteForceActivitySelector(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch16/s1/GreedyActivitySelectorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch16.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/22/15, 10:50 PM) 6 | */ 7 | public class GreedyActivitySelectorTest extends BaseActivitySelectorTest { 8 | 9 | @Override 10 | protected ActivitySelector getActivitySelector() { 11 | return new GreedyActivitySelector(); 12 | } 13 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch16/s1/RecursiveActivitySelectorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch16.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/22/15, 10:32 PM) 6 | */ 7 | public class RecursiveActivitySelectorTest extends BaseActivitySelectorTest { 8 | 9 | @Override 10 | protected ActivitySelector getActivitySelector() { 11 | return new RecursiveActivitySelector(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch21/s1/BasicDisjointSetTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch21.DisjointSet; 4 | import com.mmnaseri.cs.clrs.ch21.Element; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/2/15, 11:10 AM) 9 | */ 10 | public class BasicDisjointSetTest extends BaseDisjointSetTest { 11 | 12 | @Override 13 | protected DisjointSet, Integer> createSet() { 14 | //noinspection unchecked 15 | return new BasicDisjointSet(); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch21/s2/SimpleDisjointSetTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch21.DisjointSet; 4 | import com.mmnaseri.cs.clrs.ch21.Element; 5 | import com.mmnaseri.cs.clrs.ch21.s1.BaseDisjointSetTest; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/2/15, 11:37 AM) 10 | */ 11 | public class SimpleDisjointSetTest extends BaseDisjointSetTest { 12 | 13 | @Override 14 | protected DisjointSet, Integer> createSet() { 15 | //noinspection unchecked 16 | return new SimpleDisjointSet(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch21/s2/WeightedDisjointSetTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch21.DisjointSet; 4 | import com.mmnaseri.cs.clrs.ch21.Element; 5 | import com.mmnaseri.cs.clrs.ch21.s1.BaseDisjointSetTest; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/2/15, 11:38 AM) 10 | */ 11 | public class WeightedDisjointSetTest extends BaseDisjointSetTest { 12 | 13 | @Override 14 | protected DisjointSet, Integer> createSet() { 15 | //noinspection unchecked 16 | return new WeightedDisjointSet(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch21/s3/PathCompressingRankedForestDisjointSetTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch21.DisjointSet; 4 | import com.mmnaseri.cs.clrs.ch21.Element; 5 | import com.mmnaseri.cs.clrs.ch21.s1.BaseDisjointSetTest; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/2/15, 12:04 PM) 10 | */ 11 | public class PathCompressingRankedForestDisjointSetTest extends BaseDisjointSetTest { 12 | 13 | @Override 14 | protected DisjointSet, Integer> createSet() { 15 | //noinspection unchecked 16 | return new PathCompressingRankedForestDisjointSet(); 17 | } 18 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch21/s3/RankedForestDisjointSetTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch21.DisjointSet; 4 | import com.mmnaseri.cs.clrs.ch21.Element; 5 | import com.mmnaseri.cs.clrs.ch21.s1.BaseDisjointSetTest; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/2/15, 12:02 PM) 10 | */ 11 | public class RankedForestDisjointSetTest extends BaseDisjointSetTest { 12 | 13 | @Override 14 | protected DisjointSet, Integer> createSet() { 15 | //noinspection unchecked 16 | return new RankedForestDisjointSet(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch21/s3/SimpleForestDisjointSetTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch21.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch21.DisjointSet; 4 | import com.mmnaseri.cs.clrs.ch21.Element; 5 | import com.mmnaseri.cs.clrs.ch21.s1.BaseDisjointSetTest; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/2/15, 11:55 AM) 10 | */ 11 | public class SimpleForestDisjointSetTest extends BaseDisjointSetTest { 12 | 13 | @Override 14 | protected DisjointSet, Integer> createSet() { 15 | //noinspection unchecked,rawtypes 16 | return new SimpleForestDisjointSet(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch22/s1/AdjacencyListGraphTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/3/15) 6 | */ 7 | public class AdjacencyListGraphTest extends BaseGraphTest { 8 | 9 | @Override 10 | protected Graph graph() { 11 | return new AdjacencyListGraph<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch22/s1/AdjacencyMatrixGraphTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/3/15) 6 | */ 7 | public class AdjacencyMatrixGraphTest extends BaseGraphTest { 8 | 9 | @Override 10 | protected Graph graph() { 11 | return new AdjacencyMatrixGraph<>(); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch22/s4/DFSTopologicalSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch22.s4; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.EdgeDetails; 4 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/3/15) 9 | */ 10 | public class DFSTopologicalSorterTest extends BaseTopologicalSorterTest { 11 | 12 | @Override 13 | protected TopologicalSorter getTopologicalSorter() { 14 | return new DFSTopologicalSorter<>(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch23/s2/KruskalMinimumSpanningTreeFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch23.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/5/15) 9 | */ 10 | public class KruskalMinimumSpanningTreeFinderTest extends BaseMinimumSpanningTreeFinderTest { 11 | 12 | @Override 13 | protected MinimumSpanningTreeFinder getFinder() { 14 | return new KruskalMinimumSpanningTreeFinder<>(); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch23/s2/PrimMinimumSpanningTreeFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch23.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (8/5/15) 9 | */ 10 | public class PrimMinimumSpanningTreeFinderTest extends BaseMinimumSpanningTreeFinderTest { 11 | 12 | @Override 13 | protected MinimumSpanningTreeFinder getFinder() { 14 | return new PrimMinimumSpanningTreeFinder<>(); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch24/s3/DijkstraSingleSourceShortestPathFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch24.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch24.BaseSingleSourceShortestPathFinderTest; 6 | import com.mmnaseri.cs.clrs.ch24.SingleSourceShortestPathFinder; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (8/6/15) 11 | */ 12 | public class DijkstraSingleSourceShortestPathFinderTest extends BaseSingleSourceShortestPathFinderTest { 13 | 14 | @Override 15 | protected SingleSourceShortestPathFinder getFinder() { 16 | return new DijkstraSingleSourceShortestPathFinder<>(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch25/s1/BruteForceAllPairsShortestPathFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch25.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch25.AllPairsShortestPathFinder; 6 | import com.mmnaseri.cs.clrs.ch25.BaseAllPairsShortestPathFinderTest; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (8/10/15) 11 | */ 12 | public class BruteForceAllPairsShortestPathFinderTest extends BaseAllPairsShortestPathFinderTest { 13 | 14 | @Override 15 | protected AllPairsShortestPathFinder getFinder() { 16 | return new BruteForceAllPairsShortestPathFinder<>(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch25/s1/FasterAllPairsShortestPathFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch25.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch25.AllPairsShortestPathFinder; 6 | import com.mmnaseri.cs.clrs.ch25.BaseAllPairsShortestPathFinderTest; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (8/10/15) 11 | */ 12 | public class FasterAllPairsShortestPathFinderTest extends BaseAllPairsShortestPathFinderTest { 13 | 14 | @Override 15 | protected AllPairsShortestPathFinder getFinder() { 16 | return new FasterAllPairsShortestPathFinder<>(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch25/s1/SlowAllPairsShortestPathFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch25.s1; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch25.AllPairsShortestPathFinder; 6 | import com.mmnaseri.cs.clrs.ch25.BaseAllPairsShortestPathFinderTest; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (8/10/15) 11 | */ 12 | public class SlowAllPairsShortestPathFinderTest extends BaseAllPairsShortestPathFinderTest { 13 | 14 | @Override 15 | protected AllPairsShortestPathFinder getFinder() { 16 | return new SlowAllPairsShortestPathFinder<>(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch25/s2/FloydWarshallAllPairsShortestPathFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch25.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch25.AllPairsShortestPathFinder; 6 | import com.mmnaseri.cs.clrs.ch25.BaseAllPairsShortestPathFinderTest; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (8/10/15) 11 | */ 12 | public class FloydWarshallAllPairsShortestPathFinderTest extends BaseAllPairsShortestPathFinderTest { 13 | 14 | @Override 15 | protected AllPairsShortestPathFinder getFinder() { 16 | return new FloydWarshallAllPairsShortestPathFinder<>(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch25/s3/JohnsonAllPairsShortestPathFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch25.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch22.s1.VertexDetails; 4 | import com.mmnaseri.cs.clrs.ch23.s1.WeightedEdgeDetails; 5 | import com.mmnaseri.cs.clrs.ch25.AllPairsShortestPathFinder; 6 | import com.mmnaseri.cs.clrs.ch25.BaseAllPairsShortestPathFinderTest; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (8/11/15) 11 | */ 12 | public class JohnsonAllPairsShortestPathFinderTest extends BaseAllPairsShortestPathFinderTest { 13 | 14 | @Override 15 | protected AllPairsShortestPathFinder getFinder() { 16 | return new JohnsonAllPairsShortestPathFinder<>(); 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch27/s3/AbstractScheduledMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch02.s3.MergeSorterTest; 4 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 5 | import com.mmnaseri.cs.clrs.common.Sorter; 6 | 7 | /** 8 | * @author Milad Naseri (milad.naseri@cdk.com) 9 | * @since 1.0 (2016/03/15, 08:05) 10 | */ 11 | public abstract class AbstractScheduledMergeSorterTest extends MergeSorterTest { 12 | 13 | @Override 14 | protected Sorter getAscendingSorter() { 15 | return new ScheduledMergeSorter<>(NATURAL_COMPARATOR, getSchedulerFactory()); 16 | } 17 | 18 | protected abstract SchedulerFactory getSchedulerFactory(); 19 | 20 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch27/s3/ParallelScheduledMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 4 | import com.mmnaseri.cs.clrs.ch27.s0.impl.ContextAwareParallelSchedulerFactory; 5 | 6 | /** 7 | * @author Milad Naseri (milad.naseri@cdk.com) 8 | * @since 1.0 (2016/03/07, 14:01) 9 | */ 10 | public class ParallelScheduledMergeSorterTest extends AbstractScheduledMergeSorterTest { 11 | 12 | @Override 13 | protected SchedulerFactory getSchedulerFactory() { 14 | return new ContextAwareParallelSchedulerFactory(); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch27/s3/ParallelScheduledSimpleMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 4 | import com.mmnaseri.cs.clrs.ch27.s0.impl.ContextAwareParallelSchedulerFactory; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (3/13/16, 6:56 PM) 9 | */ 10 | public class ParallelScheduledSimpleMergeSorterTest extends ScheduledSimpleMergeSorterTest { 11 | 12 | @Override 13 | protected SchedulerFactory getSchedulerFactory() { 14 | return new ContextAwareParallelSchedulerFactory(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch27/s3/ScheduledSimpleMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch02.s3.MergeSorterTest; 4 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 5 | import com.mmnaseri.cs.clrs.common.Sorter; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (3/13/16, 6:52 PM) 10 | */ 11 | public abstract class ScheduledSimpleMergeSorterTest extends MergeSorterTest { 12 | 13 | @Override 14 | protected Sorter getAscendingSorter() { 15 | return new ScheduledSimpleMergeSorter<>(NATURAL_COMPARATOR, getSchedulerFactory()); 16 | } 17 | 18 | protected abstract SchedulerFactory getSchedulerFactory(); 19 | 20 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch27/s3/SerialScheduledMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 4 | import com.mmnaseri.cs.clrs.ch27.s0.impl.SerialSchedulerFactory; 5 | 6 | /** 7 | * @author Milad Naseri (milad.naseri@cdk.com) 8 | * @since 1.0 (2016/03/15, 08:06) 9 | */ 10 | public class SerialScheduledMergeSorterTest extends AbstractScheduledMergeSorterTest { 11 | 12 | @Override 13 | protected SchedulerFactory getSchedulerFactory() { 14 | return new SerialSchedulerFactory(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch27/s3/SerialScheduledSimpleMergeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch27.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch27.s0.SchedulerFactory; 4 | import com.mmnaseri.cs.clrs.ch27.s0.impl.SerialSchedulerFactory; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (3/13/16, 6:56 PM) 9 | */ 10 | public class SerialScheduledSimpleMergeSorterTest extends ScheduledSimpleMergeSorterTest { 11 | 12 | @Override 13 | protected SchedulerFactory getSchedulerFactory() { 14 | return new SerialSchedulerFactory(); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch28/custom/impl/SimpleInvertibleMatrixGeneratorTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.custom.impl; 2 | 3 | import com.mmnaseri.cs.clrs.ch28.custom.InvertibleMatrixGenerator; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (8/30/16, 1:55 PM) 8 | */ 9 | public class SimpleInvertibleMatrixGeneratorTest extends BaseInvertibleMatrixGeneratorTest { 10 | 11 | @Override 12 | protected InvertibleMatrixGenerator getGenerator() { 13 | return new SimpleInvertibleMatrixGenerator<>(Double.class); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch28/s1/DecompositionEquationSystemSolverTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (8/28/16, 9:57 PM) 6 | */ 7 | public class DecompositionEquationSystemSolverTest extends BaseEquationSystemSolverTest { 8 | 9 | @Override 10 | protected EquationSystemSolver getEquationSystemSolver() { 11 | return new DecompositionEquationSystemSolver<>(Double.class, new LUPMatrixDecomposer<>(Double.class)); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch28/s2/DecomposerAgnosticEquationSystemSolverTestWithLU.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch28.s1.BaseEquationSystemSolverTest; 4 | import com.mmnaseri.cs.clrs.ch28.s1.EquationSystemSolver; 5 | import com.mmnaseri.cs.clrs.ch28.s1.LUMatrixDecomposer; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/28/16, 10:20 PM) 10 | */ 11 | public class DecomposerAgnosticEquationSystemSolverTestWithLU extends BaseEquationSystemSolverTest { 12 | 13 | @Override 14 | protected EquationSystemSolver getEquationSystemSolver() { 15 | return new DecomposerAgnosticEquationSystemSolver<>(Double.class, new LUMatrixDecomposer<>(Double.class)); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch28/s2/DecomposerAgnosticEquationSystemSolverTestWithLUP.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch28.s1.BaseEquationSystemSolverTest; 4 | import com.mmnaseri.cs.clrs.ch28.s1.EquationSystemSolver; 5 | import com.mmnaseri.cs.clrs.ch28.s1.LUPMatrixDecomposer; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (8/28/16, 10:21 PM) 10 | */ 11 | public class DecomposerAgnosticEquationSystemSolverTestWithLUP extends BaseEquationSystemSolverTest { 12 | 13 | @Override 14 | protected EquationSystemSolver getEquationSystemSolver() { 15 | return new DecomposerAgnosticEquationSystemSolver<>(Double.class, new LUPMatrixDecomposer<>(Double.class)); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch28/s2/EquationSystemMatrixInverterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch28.s2; 2 | 3 | /** 4 | * @author Milad Naseri (milad.naseri@cdk.com) 5 | * @since 1.0 (8/29/16, 12:52 PM) 6 | */ 7 | public class EquationSystemMatrixInverterTest extends BaseMatrixInverterTest { 8 | 9 | @Override 10 | protected MatrixInverter getInverter() { 11 | return new EquationSystemMatrixInverter<>(Double.class); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s1/NaiveStringMatcherTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/4/16, 6:27 PM) 6 | */ 7 | public class NaiveStringMatcherTest extends BaseStringMatcherTest { 8 | 9 | @Override 10 | protected StringMatcher getStringMatcher() { 11 | return new NaiveStringMatcher(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s2/NaiveRollingHasherTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/4/16, 7:15 PM) 6 | */ 7 | public class NaiveRollingHasherTest extends BaseRollingHasherTest { 8 | 9 | @Override 10 | protected RollingHasher getHasher() { 11 | return new NaiveRollingHasher(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s2/RabinFingerprintRollingHashTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/4/16, 7:19 PM) 6 | */ 7 | public class RabinFingerprintRollingHashTest extends BaseRollingHasherTest { 8 | 9 | @Override 10 | protected RollingHasher getHasher() { 11 | return new RabinFingerprintRollingHash(701); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s2/RabinKarpStringMatcherWithFingerprintHasherTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch32.s1.BaseStringMatcherTest; 4 | import com.mmnaseri.cs.clrs.ch32.s1.StringMatcher; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (11/4/16, 7:11 PM) 9 | */ 10 | public class RabinKarpStringMatcherWithFingerprintHasherTest extends BaseStringMatcherTest { 11 | 12 | @Override 13 | protected StringMatcher getStringMatcher() { 14 | return new RabinKarpStringMatcher(new RabinFingerprintRollingHash(701)); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s2/RabinKarpStringMatcherWithNaiveHasherTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s2; 2 | 3 | import com.mmnaseri.cs.clrs.ch32.s1.BaseStringMatcherTest; 4 | import com.mmnaseri.cs.clrs.ch32.s1.StringMatcher; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (11/4/16, 7:11 PM) 9 | */ 10 | public class RabinKarpStringMatcherWithNaiveHasherTest extends BaseStringMatcherTest { 11 | 12 | @Override 13 | protected StringMatcher getStringMatcher() { 14 | return new RabinKarpStringMatcher(new NaiveRollingHasher()); 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s3/FiniteAutomataStringMatcherTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s3; 2 | 3 | import com.mmnaseri.cs.clrs.ch32.s1.BaseStringMatcherTest; 4 | import com.mmnaseri.cs.clrs.ch32.s1.StringMatcher; 5 | import com.mmnaseri.cs.clrs.ch32.s3.impl.DefaultTransitionFunctionFactory; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (11/6/16, 10:45 AM) 10 | */ 11 | public class FiniteAutomataStringMatcherTest extends BaseStringMatcherTest { 12 | 13 | @Override 14 | protected StringMatcher getStringMatcher() { 15 | return new FiniteAutomataStringMatcher(new DefaultTransitionFunctionFactory()); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s3/impl/DefaultTransitionFunctionFactoryTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s3.impl; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/6/16, 10:33 AM) 8 | */ 9 | public class DefaultTransitionFunctionFactoryTest { 10 | 11 | @Test 12 | public void testPatternTransitionFunction() throws Exception { 13 | final String pattern = "nano"; 14 | 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /cs-clrs/src/test/java/com/mmnaseri/cs/clrs/ch32/s4/KnuthMorrisPrattStringMatcherTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.clrs.ch32.s4; 2 | 3 | import com.mmnaseri.cs.clrs.ch32.s1.BaseStringMatcherTest; 4 | import com.mmnaseri.cs.clrs.ch32.s1.StringMatcher; 5 | import com.mmnaseri.cs.clrs.ch32.s4.impl.DefaultPrefixFunctionFactory; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (11/6/16, 12:49 PM) 10 | */ 11 | public class KnuthMorrisPrattStringMatcherTest extends BaseStringMatcherTest { 12 | 13 | @Override 14 | protected StringMatcher getStringMatcher() { 15 | return new KnuthMorrisPrattStringMatcher(new DefaultPrefixFunctionFactory()); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-ctci/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | cs-parent 7 | com.mmnaseri.cs 8 | 1.0 9 | ../cs-parent/pom.xml 10 | 11 | 4.0.0 12 | 13 | cs-ctci 14 | 15 | 16 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p01/BruteForceIsUnique.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p01; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 9:18 AM) 6 | */ 7 | public class BruteForceIsUnique implements IsUnique { 8 | 9 | @Override 10 | public boolean hasDuplicates(String text) { 11 | for (int i = 0; i < text.length(); i++) { 12 | for (int j = 0; j < i - 1; j++) { 13 | if (text.charAt(j) == text.charAt(i)) { 14 | return true; 15 | } 16 | } 17 | } 18 | return false; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p01/HashSetIsUnique.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p01; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (11/25/16, 9:16 AM) 9 | */ 10 | public class HashSetIsUnique implements IsUnique { 11 | 12 | @Override 13 | public boolean hasDuplicates(String text) { 14 | final Set set = new HashSet<>(); 15 | for (int i = 0; i < text.length(); i++) { 16 | final char c = text.charAt(i); 17 | if (set.contains(c)) { 18 | return true; 19 | } 20 | set.add(c); 21 | } 22 | return false; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p01/IsUnique.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p01; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 9:16 AM) 6 | */ 7 | public interface IsUnique { 8 | 9 | public boolean hasDuplicates(String text); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p01/SortingIsUnique.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p01; 2 | 3 | import java.util.Arrays; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/25/16, 9:17 AM) 8 | */ 9 | public class SortingIsUnique implements IsUnique { 10 | 11 | @Override 12 | public boolean hasDuplicates(String text) { 13 | final char[] chars = text.toCharArray(); 14 | Arrays.sort(chars); 15 | for (int i = 0; i < chars.length - 1; i++) { 16 | if (chars[i] == chars[i + 1]) { 17 | return true; 18 | } 19 | } 20 | return false; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p02/BruteForceCheckPermutation.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p02; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 9:26 AM) 6 | */ 7 | public class BruteForceCheckPermutation implements CheckPermutation { 8 | 9 | @Override 10 | public boolean isPermutation(String first, String second) { 11 | for (int i = 0; i < first.length(); i++) { 12 | boolean found = false; 13 | for (int j = 0; j < second.length(); j++) { 14 | if (second.charAt(j) == first.charAt(i)) { 15 | found = true; 16 | second = second.substring(0, j) + second.substring(j + 1); 17 | break; 18 | } 19 | } 20 | if (!found) { 21 | return false; 22 | } 23 | } 24 | return true; 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p02/CheckPermutation.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p02; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 9:26 AM) 6 | */ 7 | public interface CheckPermutation { 8 | 9 | boolean isPermutation(String first, String second); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p03/Urlify.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p03; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 9:41 AM) 6 | */ 7 | public interface Urlify { 8 | 9 | void urlify(char[] original); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p04/PalindromeAnagram.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p04; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 9:55 AM) 6 | */ 7 | public interface PalindromeAnagram { 8 | 9 | boolean isPalindromeAnagram(String text); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p05/OneAway.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p05; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 11:07 AM) 6 | */ 7 | public interface OneAway { 8 | 9 | boolean oneAway(String first, String second); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p06/IterativeStringCompressor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p06; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 11:23 AM) 6 | */ 7 | public class IterativeStringCompressor implements StringCompressor { 8 | 9 | @Override 10 | public String compress(String original) { 11 | final StringBuilder builder = new StringBuilder(); 12 | builder.append(original.charAt(0)); 13 | int count = 1; 14 | for (int i = 1; i < original.length(); i++) { 15 | if (original.charAt(i - 1) != original.charAt(i)) { 16 | builder.append(count).append(original.charAt(i)); 17 | count = 0; 18 | } 19 | count ++; 20 | } 21 | builder.append(count); 22 | return builder.length() < original.length() ? builder.toString() : original; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p06/StringCompressor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p06; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 11:22 AM) 6 | */ 7 | public interface StringCompressor { 8 | 9 | String compress(String original); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p07/MatrixRotator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p07; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 12:10 PM) 6 | */ 7 | public interface MatrixRotator { 8 | 9 | void rotate(E[][] matrix); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p08/ZeroMatrix.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p08; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 12:35 PM) 6 | */ 7 | public interface ZeroMatrix { 8 | 9 | void setZero(int[][] matrix); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p09/ConcatenatingRotationFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p09; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 12:54 PM) 6 | */ 7 | public class ConcatenatingRotationFinder extends RotationFinder { 8 | 9 | @Override 10 | public boolean isRotation(String first, String second) { 11 | return !first.isEmpty() && first.length() == second.length() && isSubstring(second.concat(second), first); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch01/p09/RotationFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch01.p09; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 12:53 PM) 6 | */ 7 | public abstract class RotationFinder { 8 | 9 | protected boolean isSubstring(String haystack, String needle) { 10 | return haystack.contains(needle); 11 | } 12 | 13 | public abstract boolean isRotation(String first, String second); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/LinkedNodeBuilder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 2:11 PM) 6 | */ 7 | public class LinkedNodeBuilder { 8 | 9 | @SafeVarargs 10 | public static DefaultSinglyLinkedNode buildSinglyLinkedList(E... items) { 11 | if (items.length == 0) { 12 | return null; 13 | } 14 | final DefaultSinglyLinkedNode head = new DefaultSinglyLinkedNode<>(); 15 | head.setData(items[0]); 16 | DefaultSinglyLinkedNode current = head; 17 | for (int i = 1; i < items.length; i++) { 18 | final DefaultSinglyLinkedNode node = new DefaultSinglyLinkedNode<>(); 19 | node.setData(items[i]); 20 | current.setNext(node); 21 | current = node; 22 | } 23 | return head; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/SinglyLinkedNode.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/25/16, 1:34 PM) 6 | */ 7 | public interface SinglyLinkedNode> { 8 | 9 | N next(); 10 | 11 | E data(); 12 | 13 | void setNext(N next); 14 | 15 | void setData(E data); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/p01/DuplicateRemover.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02.p01; 2 | 3 | import com.mmnaseri.cs.ctci.ch02.SinglyLinkedNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/25/16, 2:08 PM) 8 | */ 9 | public interface DuplicateRemover> { 10 | 11 | void removeDuplicates(N head); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/p02/KthToLastFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02.p02; 2 | 3 | import com.mmnaseri.cs.ctci.ch02.SinglyLinkedNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/25/16, 1:34 PM) 8 | */ 9 | public interface KthToLastFinder> { 10 | 11 | N find(N head, int k); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/p03/MiddleDeleter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02.p03; 2 | 3 | import com.mmnaseri.cs.ctci.ch02.SinglyLinkedNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/25/16, 1:42 PM) 8 | */ 9 | public interface MiddleDeleter> { 10 | 11 | void delete(N node); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/p03/MiddleDeleterImpl.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02.p03; 2 | 3 | import com.mmnaseri.cs.ctci.ch02.SinglyLinkedNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/25/16, 1:42 PM) 8 | */ 9 | public class MiddleDeleterImpl> implements MiddleDeleter { 10 | 11 | @Override 12 | public void delete(N node) { 13 | node.setData(node.next().data()); 14 | node.setNext(node.next().next()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/p04/ListPartitioner.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02.p04; 2 | 3 | import com.mmnaseri.cs.ctci.ch02.SinglyLinkedNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/25/16, 2:24 PM) 8 | */ 9 | public interface ListPartitioner, N extends SinglyLinkedNode> { 10 | 11 | N partition(N head, E pivot); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch02/p05/LinkAdder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch02.p05; 2 | 3 | import com.mmnaseri.cs.ctci.ch02.SinglyLinkedNode; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/25/16, 2:37 PM) 8 | */ 9 | public interface LinkAdder { 10 | 11 | > SinglyLinkedNode add(N first, N second); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch08/p11/DenominatorCounter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch08.p11; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/26/16, 10:25 PM) 6 | */ 7 | public interface DenominatorCounter { 8 | 9 | int makeChange(int amount); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch08/p12/BoardPrinter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch08.p12; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/26/16, 11:50 PM) 8 | */ 9 | public class BoardPrinter { 10 | 11 | public void print(List positions) { 12 | if (positions == null) { 13 | System.out.println("No placement found!"); 14 | return; 15 | } 16 | for (int i = 0; i < positions.size(); i++) { 17 | for (int j = 0; j < positions.size(); j++) { 18 | System.out.print(positions.get(i) == j ? 'Q' : '.'); 19 | } 20 | System.out.println(); 21 | } 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch08/p12/QueensPlacer.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch08.p12; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/26/16, 10:59 PM) 8 | */ 9 | public interface QueensPlacer { 10 | 11 | List place(int size); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-ctci/src/main/java/com/mmnaseri/cs/ctci/ch16/p18/PatternMatcher.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.ctci.ch16.p18; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/27/16, 8:26 PM) 6 | */ 7 | public interface PatternMatcher { 8 | 9 | boolean matches(String pattern, String text); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/BruteForceMinimumSizeSubarrayFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | import com.mmnaseri.cs.qa.annotation.Complexity; 4 | import com.mmnaseri.cs.qa.annotation.Quality; 5 | import com.mmnaseri.cs.qa.annotation.Stage; 6 | 7 | @Quality(Stage.DOCUMENTED) 8 | public class BruteForceMinimumSizeSubarrayFinder implements MinimumSizeSubarrayFinder { 9 | 10 | @Complexity("O(n^2)") 11 | @Override 12 | public int minSubArrayLen(int target, int[] nums) { 13 | Integer minLength = null; 14 | for (int i = 0; i < nums.length; i++) { 15 | int sum = 0; 16 | for (int j = i; j < nums.length; j++) { 17 | sum += nums[j]; 18 | if ((minLength == null || minLength > j - i) && sum >= target) { 19 | minLength = j - i + 1; 20 | } 21 | } 22 | } 23 | return minLength == null ? 0 : minLength; 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/DuplicateNumberFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | /** 4 | * Problem 6 | * here. 7 | */ 8 | public class DuplicateNumberFinder { 9 | public int findDuplicate(int[] nums) { 10 | int low = 1; 11 | int high = nums.length - 1; 12 | int duplicate = -1; 13 | 14 | while (low <= high) { 15 | int midpoint = (low + high) / 2; 16 | int left = 0; 17 | 18 | for (int num : nums) { 19 | if (num <= midpoint) { 20 | left++; 21 | } 22 | } 23 | 24 | if (left > midpoint) { 25 | duplicate = midpoint; 26 | high = midpoint - 1; 27 | } else { 28 | low = midpoint + 1; 29 | } 30 | } 31 | return duplicate; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/FirstMissingPositive.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | import com.mmnaseri.cs.qa.annotation.Quality; 4 | import com.mmnaseri.cs.qa.annotation.Stage; 5 | 6 | @Quality(Stage.BUGGY) 7 | public class FirstMissingPositive { 8 | 9 | public int firstMissingPositive(int[] nums) { 10 | for (int i = 0; i < nums.length; i++) { 11 | if (nums[i] > 0 12 | && i != nums[i] - 1 13 | && nums[i] - 1 < nums.length 14 | && nums[nums[i] - 1] != nums[i]) { 15 | int temp = nums[nums[i] - 1]; 16 | nums[nums[i] - 1] = nums[i]; 17 | nums[i] = temp; 18 | } else { 19 | i++; 20 | } 21 | } 22 | for (int i = 0; i < nums.length - 1; i++) { 23 | if (nums[i + 1] != i + 1) { 24 | return i + 1; 25 | } 26 | } 27 | return nums.length + 1; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/LargestDivisibleSubsetFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | import java.util.List; 4 | 5 | public interface LargestDivisibleSubsetFinder { 6 | List largestDivisibleSubset(int[] nums); 7 | } 8 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/LongestConsecutiveSubSequenceFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | import java.util.HashSet; 4 | import java.util.Set; 5 | 6 | public class LongestConsecutiveSubSequenceFinder { 7 | 8 | public int longestConsecutive(int[] nums) { 9 | Set hash = new HashSet<>(); 10 | for (int num : nums) { 11 | hash.add(num); 12 | } 13 | int longest = 0; 14 | for (int i = 0; i < nums.length; i ++) { 15 | if (!hash.contains(nums[i] - 1)) { 16 | int j = i; 17 | while (hash.contains(nums[i] + j - i)) { 18 | j++; 19 | } 20 | longest = Math.max(j - i, longest); 21 | } 22 | } 23 | return longest; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/MinimumSizeSubarrayFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | /** 4 | * Problem. 6 | */ 7 | public interface MinimumSizeSubarrayFinder { 8 | 9 | int minSubArrayLen(int target, int[] nums); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/SlidingWindowMaximumFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | /** 4 | * Problem 6 | * page. 7 | */ 8 | public interface SlidingWindowMaximumFinder { 9 | 10 | int[] findMaximums(int[] data, int windowSize); 11 | } 12 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/arrays/SlidingWindowMinimumSizeSubarrayFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | public class SlidingWindowMinimumSizeSubarrayFinder implements MinimumSizeSubarrayFinder { 4 | 5 | @Override 6 | public int minSubArrayLen(int target, int[] nums) { 7 | int sum = 0; 8 | Integer min = null; 9 | int start = 0; 10 | for (int i = 0; i < nums.length; i++) { 11 | sum += nums[i]; 12 | if (sum >= target) { 13 | min = Math.min(min == null ? Integer.MAX_VALUE : min, i - start + 1); 14 | while (sum >= target && start <= i) { 15 | sum -= nums[start]; 16 | start++; 17 | if (sum >= target) { 18 | min = Math.min(min, i - start + 1); 19 | } 20 | } 21 | } 22 | } 23 | return min == null ? 0 : min; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/pointers/BottomUpMemoizedUniquePathsFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public class BottomUpMemoizedUniquePathsFinder implements UniquePathsFinder { 4 | 5 | @Override 6 | public int uniquePaths(int m, int n) { 7 | if (m <= 1 || n <= 1) { 8 | return 1; 9 | } 10 | int[][] memory = new int[m - 1][]; 11 | for (int i = 0; i < m - 1; i++) { 12 | memory[i] = new int[n - 1]; 13 | } 14 | for (int i = 0; i < m - 1; i++) { 15 | for (int j = 0; j < n - 1; j++) { 16 | int left = i > 0 ? memory[i - 1][j] : 1; 17 | int up = j > 0 ? memory[i][j - 1] : 1; 18 | memory[i][j] = left + up; 19 | } 20 | } 21 | return memory[m - 2][n - 2]; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/pointers/BruteForceUniquePathsFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public class BruteForceUniquePathsFinder implements UniquePathsFinder { 4 | 5 | @Override 6 | public int uniquePaths(int m, int n) { 7 | if (m == 1 || n == 1) { 8 | return 1; 9 | } 10 | return uniquePaths(m - 1, n) + uniquePaths(m, n - 1); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/pointers/ObstacleUniquePathsFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public interface ObstacleUniquePathsFinder { 4 | int uniquePathsWithObstacles(int[][] obstacleGrid); 5 | } 6 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/pointers/UniquePathsFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public interface UniquePathsFinder { 4 | int uniquePaths(int m, int n); 5 | } 6 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/strings/LargestUniqueSubstring.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class LargestUniqueSubstring { 7 | 8 | public int lengthOfLongestSubstring(String s) { 9 | if (s.length() <= 1) { 10 | return s.length(); 11 | } 12 | Map positions = new HashMap<>(); 13 | int start = 0; 14 | int length = 0; 15 | for (int i = 0; i < s.length(); i ++) { 16 | if (positions.containsKey(s.charAt(i))) { 17 | start = Math.max(positions.get(s.charAt(i)) + 1, start); 18 | } 19 | positions.put(s.charAt(i), i); 20 | length = Math.max(length, i - start + 1); 21 | } 22 | return length; 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/strings/LongestPalindromicSubstringFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public interface LongestPalindromicSubstringFinder { 4 | 5 | String longestPalindrome(String s); 6 | } 7 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/strings/LongestSubstringWithDistinctChars.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public interface LongestSubstringWithDistinctChars { 4 | 5 | int find(String str, int distinctChars); 6 | 7 | } 8 | -------------------------------------------------------------------------------- /cs-leetcode/src/main/java/com/mmnaseri/cs/leetcode/strings/MinimumWindowSubstringFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | /** 4 | * Problem statement here. 6 | */ 7 | public interface MinimumWindowSubstringFinder { 8 | 9 | String minWindow(String haystack, String needle); 10 | } 11 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/BruteForceLargestDivisibleSubsetFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | public class BruteForceLargestDivisibleSubsetFinderTest 4 | extends BaseLargestDivisibleSubsetFinderTest { 5 | 6 | @Override 7 | protected LargestDivisibleSubsetFinder getInstance() { 8 | return new BruteForceLargestDivisibleSubsetFinder(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/BruteForceMinimumSizeSubarrayFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | public class BruteForceMinimumSizeSubarrayFinderTest extends BaseMinimumSizeSubarrayTest { 4 | 5 | @Override 6 | protected MinimumSizeSubarrayFinder getFinder() { 7 | return new BruteForceMinimumSizeSubarrayFinder(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/BruteForceSlidingWindowMaximumTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | public class BruteForceSlidingWindowMaximumTest extends BaseSlidingWindowMaximumTest { 4 | 5 | @Override 6 | protected SlidingWindowMaximumFinder finder() { 7 | return new BruteForceSlidingWindowMaximumFinder(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/BstSlidingWindowMaximumFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | public class BstSlidingWindowMaximumFinderTest extends BaseSlidingWindowMaximumTest { 4 | 5 | @Override 6 | protected SlidingWindowMaximumFinder finder() { 7 | return new BstSlidingWindowMaximumFinder(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/DequeSlidingWindowMaximumFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | public class DequeSlidingWindowMaximumFinderTest extends BaseSlidingWindowMaximumTest { 4 | 5 | @Override 6 | protected SlidingWindowMaximumFinder finder() { 7 | return new DequeSlidingWindowMaximumFinder(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/FirstMissingPositiveTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | import org.testng.annotations.DataProvider; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.hamcrest.MatcherAssert.assertThat; 7 | import static org.hamcrest.Matchers.is; 8 | 9 | public class FirstMissingPositiveTest { 10 | 11 | @DataProvider 12 | public Object[][] dataProvider() { 13 | return new Object[][] { 14 | new Object[] {new int[] {1, 2, 0}, 3}, 15 | new Object[] {new int[] {3, 4, -1, 1}, 2}, 16 | new Object[] {new int[] {7, 8, 9, 11, 12}, 1}, 17 | new Object[] {new int[] {1}, 2}, 18 | }; 19 | } 20 | 21 | @Test(dataProvider = "dataProvider", enabled = false) 22 | public void testSolution(int[] numbers, int expected) { 23 | int actual = new FirstMissingPositive().firstMissingPositive(numbers); 24 | assertThat(actual, is(expected)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/LongestConsecutiveSubSequenceFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | import static org.hamcrest.MatcherAssert.assertThat; 6 | import static org.hamcrest.Matchers.is; 7 | 8 | public class LongestConsecutiveSubSequenceFinderTest { 9 | 10 | @Test 11 | public void testSolution() { 12 | assertThat( 13 | new LongestConsecutiveSubSequenceFinder() 14 | .longestConsecutive(new int[] {100, 4, 200, 1, 3, 2}), 15 | is(4)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/arrays/SlidingWindowMinimumSizeSubarrayFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.arrays; 2 | 3 | public class SlidingWindowMinimumSizeSubarrayFinderTest extends BaseMinimumSizeSubarrayTest { 4 | 5 | @Override 6 | protected MinimumSizeSubarrayFinder getFinder() { 7 | return new SlidingWindowMinimumSizeSubarrayFinder(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/AddNumbersTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | import com.mmnaseri.cs.leetcode.pointers.AddNumbers.ListNode; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.hamcrest.MatcherAssert.assertThat; 7 | import static org.hamcrest.Matchers.is; 8 | 9 | public class AddNumbersTest { 10 | 11 | @Test 12 | public void testSolution() { 13 | ListNode first = new ListNode(2, new ListNode(4, new ListNode(3))); 14 | ListNode second = new ListNode(5, new ListNode(6, new ListNode(4))); 15 | assertThat( 16 | new AddNumbers().addTwoNumbers(first, second), 17 | is(new ListNode(7, new ListNode(0, new ListNode(8))))); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/BaseUniquePathsFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | import org.testng.annotations.DataProvider; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.hamcrest.MatcherAssert.assertThat; 7 | import static org.hamcrest.Matchers.is; 8 | 9 | public abstract class BaseUniquePathsFinderTest { 10 | 11 | protected abstract UniquePathsFinder getInstance(); 12 | 13 | @DataProvider 14 | public Object[][] dataProvider() { 15 | return new Object[][] { 16 | new Object[] {3, 7, 28}, 17 | new Object[] {3, 2, 3}, 18 | new Object[] {7, 3, 28}, 19 | new Object[] {3, 3, 6}, 20 | }; 21 | } 22 | 23 | @Test(dataProvider = "dataProvider") 24 | public void testSolution(int rows, int cols, int uniquePaths) { 25 | assertThat(getInstance().uniquePaths(rows, cols), is(uniquePaths)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/BottomUpMemoizedUniquePathsFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public class BottomUpMemoizedUniquePathsFinderTest extends BaseUniquePathsFinderTest { 4 | 5 | @Override 6 | protected UniquePathsFinder getInstance() { 7 | return new BottomUpMemoizedUniquePathsFinder(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/BottomUpObstacleUniquePathsFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public class BottomUpObstacleUniquePathsFinderTest extends BaseObstacleUniquePathsFinderTest { 4 | 5 | @Override 6 | protected ObstacleUniquePathsFinder getInstance() { 7 | return new BottomUpObstacleUniquePathsFinder(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/BruteForceObstacleUniquePathsFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public class BruteForceObstacleUniquePathsFinderTest extends BaseObstacleUniquePathsFinderTest { 4 | 5 | @Override 6 | protected ObstacleUniquePathsFinder getInstance() { 7 | return new BruteForceObstacleUniquePathsFinder(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/BruteForceUniquePathsFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public class BruteForceUniquePathsFinderTest extends BaseUniquePathsFinderTest { 4 | 5 | @Override 6 | protected UniquePathsFinder getInstance() { 7 | return new BruteForceUniquePathsFinder(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/MemoizedUniquePathsFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | public class MemoizedUniquePathsFinderTest extends BaseUniquePathsFinderTest { 4 | 5 | @Override 6 | protected UniquePathsFinder getInstance() { 7 | return new MemoizedUniquePathsFinder(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/pointers/OptimizedBottomUpObstacleUniquePathsFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.pointers; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | public class OptimizedBottomUpObstacleUniquePathsFinderTest extends BaseObstacleUniquePathsFinderTest { 6 | 7 | @Override 8 | protected ObstacleUniquePathsFinder getInstance() { 9 | return new OptimizedBottomUpObstacleUniquePathsFinder(); 10 | } 11 | 12 | @Override 13 | @Test(enabled = false) 14 | public void testSolution(int[][] grid, int uniquePaths) { 15 | super.testSolution(grid, uniquePaths); 16 | } 17 | } -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/BaseLongestSubstringWithDistinctCharsTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | import org.testng.annotations.DataProvider; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.hamcrest.MatcherAssert.assertThat; 7 | import static org.hamcrest.Matchers.is; 8 | 9 | public abstract class BaseLongestSubstringWithDistinctCharsTest { 10 | 11 | protected abstract LongestSubstringWithDistinctChars getSolver(); 12 | 13 | @DataProvider 14 | public Object[][] dataProvider() { 15 | return new Object[][]{ 16 | new Object[]{"aabacbebebe", 3, 7}, 17 | new Object[]{"aaaa", 2, -1}, 18 | }; 19 | } 20 | 21 | @Test(dataProvider = "dataProvider") 22 | public void testSolution(String str, int distinctChars, int expectedAnswer) { 23 | int answer = getSolver().find(str, distinctChars); 24 | assertThat(answer, is(expectedAnswer)); 25 | } 26 | } -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/BruteForceLongestPalindromicSubstringFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public class BruteForceLongestPalindromicSubstringFinderTest 4 | extends BaseLongestPalindromicSubstringFinderTest { 5 | 6 | @Override 7 | protected LongestPalindromicSubstringFinder getInstance() { 8 | return new BruteForceLongestPalindromicSubstringFinder(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/BruteForceLongestSubstringWithDistinctCharsTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public class BruteForceLongestSubstringWithDistinctCharsTest 4 | extends BaseLongestSubstringWithDistinctCharsTest { 5 | 6 | @Override 7 | protected LongestSubstringWithDistinctChars getSolver() { 8 | return new BruteForceLongestSubstringWithDistinctChars(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/BruteForceMinimumWindowSubstringFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public class BruteForceMinimumWindowSubstringFinderTest extends BaseMinimumWindowSubstringFinderTest { 4 | 5 | @Override 6 | protected MinimumWindowSubstringFinder getFinder() { 7 | return new BruteForceMinimumWindowSubstringFinder(); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/LargestUniqueSubstringTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | import org.testng.annotations.DataProvider; 4 | import org.testng.annotations.Test; 5 | 6 | import static org.hamcrest.MatcherAssert.assertThat; 7 | import static org.hamcrest.Matchers.is; 8 | 9 | public class LargestUniqueSubstringTest { 10 | 11 | @DataProvider 12 | public Object[][] dataProvider() { 13 | return new Object[][] { 14 | new Object[] {"", 0}, 15 | new Object[] {"a", 1}, 16 | new Object[] {"aaaaaa", 1}, 17 | new Object[] {"dvdf", 3}, 18 | new Object[] {"au", 2}, 19 | new Object[] {"abba", 2}, 20 | }; 21 | } 22 | 23 | @Test(dataProvider = "dataProvider") 24 | public void testSolution(String str, int expected) { 25 | assertThat(new LargestUniqueSubstring().lengthOfLongestSubstring(str), is(expected)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/MemoizedLongestPalindromicSubstringFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public class MemoizedLongestPalindromicSubstringFinderTest 4 | extends BaseLongestPalindromicSubstringFinderTest { 5 | 6 | @Override 7 | protected LongestPalindromicSubstringFinder getInstance() { 8 | return new MemoizedLongestPalindromicSubstringFinder(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/SlidingWindowLongestSubstringWithDistinctCharsTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public class SlidingWindowLongestSubstringWithDistinctCharsTest extends BaseLongestSubstringWithDistinctCharsTest { 4 | 5 | @Override 6 | protected LongestSubstringWithDistinctChars getSolver() { 7 | return new SlidingWindowLongestSubstringWithDistinctChars(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-leetcode/src/test/java/com/mmnaseri/cs/leetcode/strings/SlidingWindowMinimumWindowSubstringFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.leetcode.strings; 2 | 3 | public class SlidingWindowMinimumWindowSubstringFinderTest extends BaseMinimumWindowSubstringFinderTest { 4 | 5 | @Override 6 | protected MinimumWindowSubstringFinder getFinder() { 7 | return new SlidingWindowMinimumWindowSubstringFinder(); 8 | } 9 | } -------------------------------------------------------------------------------- /cs-qa/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 4.0.0 7 | 8 | 9 | cs-parent 10 | com.mmnaseri.cs 11 | 1.0 12 | ../cs-parent/pom.xml 13 | 14 | 15 | cs-qa 16 | 17 | CS Review: Quality Assurance 18 | 19 | 20 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/annotation/Complexity.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/23/15) 11 | */ 12 | @Retention(RetentionPolicy.SOURCE) 13 | @Target({ElementType.METHOD, ElementType.LOCAL_VARIABLE, ElementType.PARAMETER}) 14 | public @interface Complexity { 15 | 16 | String value(); 17 | 18 | String explanation() default ""; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/annotation/Monitored.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/27/15, 2:52 AM) 11 | */ 12 | @Target(ElementType.TYPE) 13 | @Retention(RetentionPolicy.SOURCE) 14 | public @interface Monitored { 15 | 16 | Class value(); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/annotation/Quality.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/20/15) 11 | */ 12 | @Target({ElementType.TYPE, ElementType.METHOD}) 13 | @Retention(RetentionPolicy.SOURCE) 14 | public @interface Quality { 15 | 16 | Stage value(); 17 | 18 | String explanation() default ""; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/annotation/Test.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/24/15) 11 | */ 12 | @Target({ElementType.TYPE, ElementType.METHOD}) 13 | @Retention(RetentionPolicy.SOURCE) 14 | public @interface Test { 15 | 16 | String name(); 17 | 18 | String method() default ""; 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/annotation/Tests.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.annotation; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/24/15) 11 | */ 12 | @Target({ElementType.TYPE, ElementType.METHOD}) 13 | @Retention(RetentionPolicy.SOURCE) 14 | public @interface Tests { 15 | 16 | Test[] value(); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/monitor/Feature.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.monitor; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/27/15, 12:31 AM) 6 | */ 7 | public interface Feature extends FeatureController { 8 | 9 | String getName(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/monitor/FeatureController.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.monitor; 2 | 3 | import com.mmnaseri.cs.qa.monitor.impl.Failure; 4 | 5 | import java.util.Set; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (7/27/15, 12:41 AM) 10 | */ 11 | public interface FeatureController { 12 | 13 | Set> control(D dataStructure); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/monitor/Monitor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.monitor; 2 | 3 | import java.util.Set; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/27/15, 12:31 AM) 8 | */ 9 | public interface Monitor { 10 | 11 | Set> getFeatures(); 12 | 13 | void validate(D dataStructure); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/monitor/error/MonitorFailureException.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.monitor.error; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/27/15, 12:34 AM) 6 | */ 7 | public class MonitorFailureException extends RuntimeException { 8 | 9 | public MonitorFailureException(String message) { 10 | super(message); 11 | } 12 | 13 | public MonitorFailureException(String message, Throwable cause) { 14 | super(message, cause); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/monitor/impl/BoundMonitor.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.monitor.impl; 2 | 3 | import com.mmnaseri.cs.qa.monitor.Monitor; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (7/27/15, 12:51 AM) 8 | */ 9 | public class BoundMonitor { 10 | 11 | private final Monitor monitor; 12 | private final D dataStructure; 13 | 14 | public BoundMonitor(Monitor monitor, D dataStructure) { 15 | this.monitor = monitor; 16 | this.dataStructure = dataStructure; 17 | } 18 | 19 | public void validate() { 20 | monitor.validate(dataStructure); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/monitor/impl/ControlledFeature.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.monitor.impl; 2 | 3 | import com.mmnaseri.cs.qa.monitor.Feature; 4 | import com.mmnaseri.cs.qa.monitor.FeatureController; 5 | 6 | import java.util.Set; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (7/27/15, 12:48 AM) 11 | */ 12 | public class ControlledFeature implements Feature { 13 | 14 | private final String name; 15 | private final FeatureController controller; 16 | 17 | public ControlledFeature(String name, FeatureController controller) { 18 | this.name = name; 19 | this.controller = controller; 20 | } 21 | 22 | @Override 23 | public String getName() { 24 | return name; 25 | } 26 | 27 | @Override 28 | public Set> control(D dataStructure) { 29 | return controller.control(dataStructure); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/monitor/impl/Failure.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.monitor.impl; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (7/27/15, 12:35 AM) 6 | */ 7 | public class Failure { 8 | 9 | private final Object source; 10 | private final D dataStructure; 11 | private final String explanation; 12 | 13 | public Failure(Object source, D dataStructure, String explanation) { 14 | this.source = source; 15 | this.dataStructure = dataStructure; 16 | this.explanation = explanation; 17 | } 18 | 19 | public Object getSource() { 20 | return source; 21 | } 22 | 23 | public D getDataStructure() { 24 | return dataStructure; 25 | } 26 | 27 | public String getExplanation() { 28 | return explanation; 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /cs-qa/src/main/java/com/mmnaseri/cs/qa/testng/DataProvisionUtils.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.qa.testng; 2 | 3 | public final class DataProvisionUtils { 4 | 5 | private DataProvisionUtils() throws IllegalAccessException { 6 | throw new IllegalAccessException("This type shouldn't be instantiated."); 7 | } 8 | 9 | public static Object[][] merge(Object[][] originalCases, Object[][] additionalCases) { 10 | Object[][] allCases = new Object[originalCases.length + additionalCases.length][]; 11 | System.arraycopy(originalCases, 0, allCases, 0, originalCases.length); 12 | System.arraycopy(additionalCases, 0, allCases, originalCases.length, additionalCases.length); 13 | return allCases; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch02/s6/PowerCalculator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch02.s6; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 12:41 AM) 6 | */ 7 | public interface PowerCalculator { 8 | 9 | double calculate(double base, int exponent); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch04/s8/Merger.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s8; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/12/16, 12:57 AM) 8 | */ 9 | public interface Merger { 10 | 11 | @SuppressWarnings("unchecked") 12 | List merge(List... lists); 13 | 14 | } 15 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch04/s9/ss1/NaiveOccurrenceCounter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss1; 2 | 3 | import com.mmnaseri.cs.qa.annotation.Quality; 4 | import com.mmnaseri.cs.qa.annotation.Stage; 5 | 6 | /** 7 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 8 | * @since 1.0 (11/12/16, 10:55 AM) 9 | */ 10 | @Quality(Stage.TESTED) 11 | public class NaiveOccurrenceCounter implements OccurrenceCounter { 12 | 13 | @Override 14 | public int count(E[] array, E item) { 15 | int count = 0; 16 | for (E e : array) { 17 | if (e.equals(item)) { 18 | count ++; 19 | } 20 | } 21 | return count; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch04/s9/ss1/OccurrenceCounter.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 10:54 AM) 6 | */ 7 | public interface OccurrenceCounter { 8 | 9 | int count(E[] array, E item); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch04/s9/ss2/PrefixLengthFinder.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 1:08 PM) 6 | */ 7 | public interface PrefixLengthFinder { 8 | 9 | int findPrefixLength(E[] array); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch07/s1/BacktrackEventListener.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch07.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 11:18 PM) 6 | */ 7 | public interface BacktrackEventListener { 8 | 9 | void onBeforeBacktrack(BacktrackingContext context); 10 | 11 | void onAfterBacktrack(BacktrackingContext context); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch07/s1/BacktrackHandler.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch07.s1; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/12/16, 11:15 PM) 8 | */ 9 | public interface BacktrackHandler { 10 | 11 | boolean isSolution(BacktrackingContext context); 12 | 13 | void process(BacktrackingContext context); 14 | 15 | List generateCandidates(BacktrackingContext context); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch07/s1/Backtracker.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch07.s1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 11:13 PM) 6 | */ 7 | public interface Backtracker { 8 | 9 | void backtrack(D data, BacktrackHandler callback); 10 | 11 | void backtrack(BacktrackHandler callback); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch07/s1/BacktrackingContext.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch07.s1; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/12/16, 11:14 PM) 8 | */ 9 | public interface BacktrackingContext { 10 | 11 | void stop(); 12 | 13 | boolean isStopped(); 14 | 15 | List current(); 16 | 17 | int size(); 18 | 19 | D data(); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch08/s1/FibonacciNumberGenerator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch08.s1; 2 | 3 | import java.math.BigInteger; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/13/16, 8:35 AM) 8 | */ 9 | public interface FibonacciNumberGenerator { 10 | 11 | BigInteger generate(int index); 12 | 13 | } 14 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch08/s1/NaiveFibonacciNumberGenerator.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch08.s1; 2 | 3 | import com.mmnaseri.cs.qa.annotation.Quality; 4 | import com.mmnaseri.cs.qa.annotation.Stage; 5 | 6 | import java.math.BigInteger; 7 | 8 | /** 9 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 10 | * @since 1.0 (11/13/16, 8:35 AM) 11 | */ 12 | @Quality(Stage.UNTESTED) 13 | public class NaiveFibonacciNumberGenerator implements FibonacciNumberGenerator { 14 | 15 | @Override 16 | public BigInteger generate(int index) { 17 | return index <= 1 ? BigInteger.ONE : generate(index - 1).add(generate(index - 2)); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch08/s6/ContextFreeGrammar.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch08.s6; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/30/16, 4:55 PM) 8 | */ 9 | public interface ContextFreeGrammar { 10 | 11 | GrammarRule getStartingRule(); 12 | 13 | List getRules(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch08/s6/GrammarRule.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch08.s6; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/30/16, 4:54 PM) 6 | */ 7 | public abstract class GrammarRule { 8 | 9 | public abstract String getMnemonic(); 10 | 11 | } 12 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch08/s6/NonTerminalGrammarRule.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch08.s6; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/30/16, 4:56 PM) 8 | */ 9 | public abstract class NonTerminalGrammarRule extends GrammarRule { 10 | 11 | private final List terms; 12 | 13 | protected NonTerminalGrammarRule(List terms) { 14 | this.terms = terms; 15 | } 16 | 17 | public List getTerms() { 18 | return terms; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /cs-skiena/src/main/java/com/mmnaseri/cs/skiena/ch08/s6/TerminalGrammarRule.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch08.s6; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/30/16, 4:56 PM) 6 | */ 7 | public abstract class TerminalGrammarRule extends GrammarRule { 8 | 9 | private final String terminal; 10 | 11 | protected TerminalGrammarRule(String terminal) { 12 | this.terminal = terminal; 13 | } 14 | 15 | public String getTerminal() { 16 | return terminal; 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch03/s3/InOrderBalancedTreeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch03.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.Sorter; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (11/12/16, 10:27 AM) 10 | */ 11 | public class InOrderBalancedTreeSorterTest extends BaseSortTest { 12 | 13 | @Override 14 | protected Sorter getSorter(Comparator comparator) { 15 | return new InOrderBalancedTreeSorter<>(comparator); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch03/s3/MinimumDeleteBalancedTreeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch03.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.Sorter; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (11/12/16, 10:45 AM) 10 | */ 11 | public class MinimumDeleteBalancedTreeSorterTest extends BaseSortTest { 12 | 13 | @Override 14 | protected Sorter getSorter(Comparator comparator) { 15 | return new MinimumDeleteBalancedTreeSorter<>(comparator); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch03/s3/MinimumSuccessorBalancedTreeSorterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch03.s3; 2 | 3 | import com.mmnaseri.cs.clrs.common.Sorter; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (11/12/16, 10:36 AM) 10 | */ 11 | public class MinimumSuccessorBalancedTreeSorterTest extends BaseSortTest { 12 | 13 | @Override 14 | protected Sorter getSorter(Comparator comparator) { 15 | return new MinimumSuccessorBalancedTreeSorter<>(comparator); 16 | } 17 | 18 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s8/impl/ComparingHeapMergerTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s8.impl; 2 | 3 | import com.mmnaseri.cs.skiena.ch04.s8.Merger; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (11/17/16, 3:19 PM) 8 | */ 9 | public class ComparingHeapMergerTest extends BaseMergerTest { 10 | 11 | @Override 12 | protected Merger getMerger() { 13 | return new ComparingHeapMerger<>(NATURAL_ORDER); 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s8/impl/HeapMergerTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s8.impl; 2 | 3 | import com.mmnaseri.cs.skiena.ch04.s8.Merger; 4 | 5 | import java.util.Comparator; 6 | 7 | /** 8 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 9 | * @since 1.0 (11/12/16, 9:59 AM) 10 | */ 11 | public class HeapMergerTest extends BaseMergerTest { 12 | 13 | @Override 14 | protected Merger getMerger() { 15 | return new HeapMerger<>(new Comparator() { 16 | @Override 17 | public int compare(Integer first, Integer second) { 18 | return Integer.compare(first, second); 19 | } 20 | }); 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s8/impl/NaiveMergerTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s8.impl; 2 | 3 | import com.mmnaseri.cs.skiena.ch04.s8.Merger; 4 | 5 | /** 6 | * @author Milad Naseri (milad.naseri@cdk.com) 7 | * @since 1.0 (11/17/16, 3:28 PM) 8 | */ 9 | public class NaiveMergerTest extends BaseMergerTest { 10 | 11 | @Override 12 | protected Merger getMerger() { 13 | return new NaiveMerger<>(NATURAL_ORDER); 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s9/ss1/BinarySearchOccurrenceCounterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss1; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 1:05 PM) 6 | */ 7 | public class BinarySearchOccurrenceCounterTest extends BaseOccurrenceCounterTest { 8 | 9 | @Override 10 | protected OccurrenceCounter getCounter() { 11 | return new BinarySearchOccurrenceCounter<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s9/ss1/FinderOccurrenceCounterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss1; 2 | 3 | import com.mmnaseri.cs.clrs.ch02.s3.BinarySearchFinder; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/12/16, 11:24 AM) 8 | */ 9 | public class FinderOccurrenceCounterTest extends BaseOccurrenceCounterTest { 10 | 11 | @Override 12 | protected OccurrenceCounter getCounter() { 13 | return new FinderOccurrenceCounter<>(new BinarySearchFinder()); 14 | } 15 | 16 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s9/ss1/NaiveOccurrenceCounterTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss1; 2 | 3 | import org.testng.annotations.Test; 4 | 5 | /** 6 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 7 | * @since 1.0 (11/12/16, 10:56 AM) 8 | */ 9 | public class NaiveOccurrenceCounterTest extends BaseOccurrenceCounterTest { 10 | 11 | @Override 12 | protected OccurrenceCounter getCounter() { 13 | return new NaiveOccurrenceCounter<>(); 14 | } 15 | 16 | @Test(dataProvider = "arrayProvider") 17 | public void testCountingUnsortedArrays(Integer[] array) throws Exception { 18 | testCounting(array); 19 | } 20 | 21 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s9/ss2/BinarySearchPrefixLengthFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 4:55 PM) 6 | */ 7 | public class BinarySearchPrefixLengthFinderTest extends BasePrefixLengthFinderTest { 8 | 9 | @Override 10 | protected PrefixLengthFinder getLengthFinder() { 11 | return new BinarySearchPrefixLengthFinder<>(); 12 | } 13 | 14 | } -------------------------------------------------------------------------------- /cs-skiena/src/test/java/com/mmnaseri/cs/skiena/ch04/s9/ss2/NaivePrefixLengthFinderTest.java: -------------------------------------------------------------------------------- 1 | package com.mmnaseri.cs.skiena.ch04.s9.ss2; 2 | 3 | /** 4 | * @author Mohammad Milad Naseri (mmnaseri@programmer.net) 5 | * @since 1.0 (11/12/16, 1:14 PM) 6 | */ 7 | public class NaivePrefixLengthFinderTest extends BasePrefixLengthFinderTest { 8 | 9 | @Override 10 | protected NaivePrefixLengthFinder getLengthFinder() { 11 | return new NaivePrefixLengthFinder<>(); 12 | } 13 | 14 | } --------------------------------------------------------------------------------