Skip to content

Conversation

@janAkali
Copy link
Contributor

I used linear_search.nim as base, so checkBinarySearch template is redundant, but could be useful in future for other implementations. I am also not sure if it is a good idea or not to check if array is sorted at the start of function; for example:

from std/algorithm import isSorted, SortOrder

func binarySearch*[T:Ordinal](arr: openArray[T], key: T): Option[Natural] {.raises: [ValueError].} =
  if not arr.isSorted(Ascending):
    raise newException(ValueError, "Array is not sorted or not in ascending order.")

@janAkali janAkali requested a review from dlesnoff as a code owner June 22, 2023 05:24
Copy link
Member

@SatinWukerORIG SatinWukerORIG left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code looks very good! However, I recommend adding a recursive binary search in order to provide another alternative to people who wants to learn binary search. See https://www.geeksforgeeks.org/binary-search/

@janAkali
Copy link
Contributor Author

I recommend adding a recursive binary search in order to provide another alternative to people who wants to learn binary search. See https://www.geeksforgeeks.org/binary-search/

Thank you for the link! I added recursive version and fixed a little inconsistency: mid.Natural->Natural(mid).

Copy link
Member

@SatinWukerORIG SatinWukerORIG left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks great!

Copy link
Contributor

@ZoomRmc ZoomRmc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your contribution! Please, consider the proposed changes.

Copy link
Collaborator

@dlesnoff dlesnoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your nice implementation!
Some more tests are required but apart from that, the implementation is great.
Please specify that you do not provide a specific element in case of duplicates.
The choice of pivot has to be explained. You use a neat trick to avoid arithmetic overflow and that particularity is non-trivial for beginners.

Copy link
Collaborator

@dlesnoff dlesnoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed my mind. Let us just refer to Wikipedia for precisions on theoretical aspects, it will ever be more reviewed and better referenced as well.
Simplify the docstring as suggested, and I'll finally accept the changes.

@dlesnoff
Copy link
Collaborator

Run nimpretty to remove trailing whitespaces. You can wrap the arguments on one line by adding a line break after the parenthesis instead of the automatically inserted line break by nimpretty.
I will merge it immediately after.

Copy link
Collaborator

@dlesnoff dlesnoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice first contribution!

@dlesnoff dlesnoff merged commit c83ceae into TheAlgorithms:main Jun 23, 2023
dlesnoff pushed a commit to dlesnoff/Nim-Algorithms that referenced this pull request Jun 23, 2023
* Add binary search

* Update binary search: add recursive version

* Update binary search: better description

* Update binary search: update runnableExamples

* Update binary search: improve tests, add overload for recursive func

* Update binary search: evaluate if-expression into result

* grammar

* Update binary search: improve description, add comments

* Update binary search: add missing test cases

* Update binary search: add info about pivot choice in description, rearrange it

* Update binary search: change int to Natural

* Update binary search: if block -> guard clause

* Update binary search: test cases

* Update binary search: simplify docs

* Update binary search: nimpretty
dlesnoff pushed a commit to dlesnoff/Nim-Algorithms that referenced this pull request Jun 23, 2023
* Add binary search

* Update binary search: add recursive version

* Update binary search: better description

* Update binary search: update runnableExamples

* Update binary search: improve tests, add overload for recursive func

* Update binary search: evaluate if-expression into result

* grammar

* Update binary search: improve description, add comments

* Update binary search: add missing test cases

* Update binary search: add info about pivot choice in description, rearrange it

* Update binary search: change int to Natural

* Update binary search: if block -> guard clause

* Update binary search: test cases

* Update binary search: simplify docs

* Update binary search: nimpretty
dlesnoff pushed a commit to dlesnoff/Nim-Algorithms that referenced this pull request Jun 23, 2023
* Add binary search

* Update binary search: add recursive version

* Update binary search: better description

* Update binary search: update runnableExamples

* Update binary search: improve tests, add overload for recursive func

* Update binary search: evaluate if-expression into result

* grammar

* Update binary search: improve description, add comments

* Update binary search: add missing test cases

* Update binary search: add info about pivot choice in description, rearrange it

* Update binary search: change int to Natural

* Update binary search: if block -> guard clause

* Update binary search: test cases

* Update binary search: simplify docs

* Update binary search: nimpretty
dlesnoff pushed a commit to dlesnoff/Nim-Algorithms that referenced this pull request Jul 4, 2023
* Add binary search

* Update binary search: add recursive version

* Update binary search: better description

* Update binary search: update runnableExamples

* Update binary search: improve tests, add overload for recursive func

* Update binary search: evaluate if-expression into result

* grammar

* Update binary search: improve description, add comments

* Update binary search: add missing test cases

* Update binary search: add info about pivot choice in description, rearrange it

* Update binary search: change int to Natural

* Update binary search: if block -> guard clause

* Update binary search: test cases

* Update binary search: simplify docs

* Update binary search: nimpretty
dlesnoff added a commit that referenced this pull request Sep 8, 2023
* Add a .github action to build DIRECTORY.md

* Update gh action build_directory_md

* Add ignored paths and git credentials

* chore: minor Gitpod improvements (#34)

Add Gitpod badge and prebuilds for all branches and forks

* Add binary search (#37)

* Add binary search

* Update binary search: add recursive version

* Update binary search: better description

* Update binary search: update runnableExamples

* Update binary search: improve tests, add overload for recursive func

* Update binary search: evaluate if-expression into result

* grammar

* Update binary search: improve description, add comments

* Update binary search: add missing test cases

* Update binary search: add info about pivot choice in description, rearrange it

* Update binary search: change int to Natural

* Update binary search: if block -> guard clause

* Update binary search: test cases

* Update binary search: simplify docs

* Update binary search: nimpretty

* Apply suggestions from code review

Co-authored-by: David Leal <halfpacho@gmail.com>

* Replace by an attempt of github pr create

* Fix branching and environment variable in the PR

Co-authored-by: David Leal <halfpacho@gmail.com>

* Create and populate the Maths directory (#4)

* Add a sample of maths basic algorithms

* Update maths/abs.nim

Co-authored-by: Zoom <ZoomRmc@users.noreply.github.com>

* Use openArray in absMaxSort

Co-authored-by: Zoom <ZoomRmc@users.noreply.github.com>

* Fix seq->openArray and int->SomeInteger

* Use Positive as input instead

* Update maths/addition_without_arithmetic.nim

Co-authored-by: Pietro Peterlongo <pietro.peterlongo@gmail.com>

* Name allocation number

* [maths/abs] Replace maxAbsSort by signed[Min/Max]Abs

* [Aliquot Sum] Add header

* Add empty line at end of file

* Remove Allocation number since it is a non standard algorithm

* Fix titles

* Run nimpretty on the files

* Rename file and add DIRECTORY.md



---------

Co-authored-by: Dimitri LESNOFF <dimitri.lesnoff@lip6.fr>
Co-authored-by: David Leal <halfpacho@gmail.com>

* Add arc length (#10)

* Fix linear search (#33)

* Use a dynamic allocated array (sequence) for strings

* Run nimpretty

* Add requested changes

* Fix documentation generation

* Fix test title according to changes

Co-authored-by: Satin Wuker <74630829+SatinWuker@users.noreply.github.com>

* Update comments to warn about indexing issues

Modified a bit the suggestions of comments. Please check them before approving.

Co-authored-by: Zoom <ZoomRmc@users.noreply.github.com>

---------

Co-authored-by: Dimitri LESNOFF <dimitri.lesnoff@lip6.fr>
Co-authored-by: Zoom <ZoomRmc@users.noreply.github.com>

* chore: run `apt-get update` before running other commands (#41)

This will run `sudo apt-get update` before running any other commands on the Gitpod prebuild image (`.gitpod.dockerfile`).

* Readme: fix gitter link, add Nim logo, formatting fixes (#42)

* Update README.md

Use more extended markdown syntax instead of HTML,
Add Matrix links
Superseed PR #40

* Actually fix gitter! Move img src links to footer.

Also changed the TheAlgorithms logo image link.

* Restore TheAlgorithms logo link

* More link fixes

---------

Co-authored-by: dlesnoff <54949944+dlesnoff@users.noreply.github.com>

* fix: nimpretty for `arc_length.nim` (#43)

* chore: `gc`->`mm`, move back to `config.nims` (#47)

* chore: revert #41 (#45)

* Update codeowners

* Fix: CONTRIBUTING.md links (#49)

Uppercase `directory.md` to `DIRECTORY.md`

* feat: add Levenshtein distance (#46)

* feat: add Levenshtein distance

* Apply suggestions from code review

Co-authored-by: Zoom <ZoomRmc@users.noreply.github.com>

* refactor: use toKey in initSubsolutions

* style: use .Natural

* style: remove blank line

* refactor: add Key type

* style: use descriptive variable names

* style: use a, b instead of strA, strB

* docs: add note about complexity

* refator: add name to TestCase

* docs: remove sentence about dp

* docs: update documentation of `levenshteinDistance`

Co-authored-by: Zoom <ZoomRmc@users.noreply.github.com>

* docs: rename initLevenshteinDistanceMatrix and add its documentation

* refactor: add fillLevenshteinDistanceMatrix

* tests: reorganise tests, remove TestCase type

* docs: add edit distance to module-level documentation

* docs: mention Wagner–Fischer algorithm

* docs: add comment in fillLevenshteinDistanceMatrix

* style: reformat fillLevenshteinDistanceMatrix

* docs: update DIRECTORY.md

---------

Co-authored-by: Zoom <ZoomRmc@users.noreply.github.com>

* docs: add missing `#` (#50)

* docs: add missing `#`

* docs: update DIRECTORY.md

* docs: remove ` of a Circle`

* docs: update DIRECTORY.md

---------

Co-authored-by: dlesnoff <54949944+dlesnoff@users.noreply.github.com>

* Fix: Remove unuseful date command

* chore: Update checkout version to v4 in build_directory_md

* Add error status checking + separate compilation and execution of directory.nim

---------

Co-authored-by: Dimitri LESNOFF <dimitri.lesnoff@lip6.fr>
Co-authored-by: David Leal <halfpacho@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants