Skip to content

Replace quadratic Reverse with quasilinear#8301

Closed
andralex wants to merge 1 commit intodlang:masterfrom
andralex:Reverse
Closed

Replace quadratic Reverse with quasilinear#8301
andralex wants to merge 1 commit intodlang:masterfrom
andralex:Reverse

Conversation

@andralex
Copy link
Member

Since alias sequences are stored internally as arrays, Reverse is quadratic because it builds an array by prepending an element. Each step creates a new array and copies the existing one into it.

The proposed implementation uses the quadratic algorithm for short arrays (where it is still efficient) and switches to a divide & conquer approach for larger arrays. Unless I'm wrong it does O(n) work for each level of the tree formed by halving, for a total of O(n long n) work. The short arrays case improves this by a constant. factor.

I think we ought to examine other compile-time algorithms with an eye for compile-time complexity. Also, per the #8039, this pattern should be detected and implemented so it has constant amortized complexity:

x = AliasSeq!(x, one_more_element);

@andralex andralex requested a review from MetaLang as a code owner October 21, 2021 22:23
@dlang-bot
Copy link
Contributor

Thanks for your pull request, @andralex!

Bugzilla references

Your PR doesn't reference any Bugzilla issue.

If your PR contains non-trivial changes, please reference a Bugzilla issue or create a manual changelog.

Testing this PR locally

If you don't have a local development environment setup, you can use Digger to test this PR:

dub run digger -- build "master + phobos#8301"

@andralex
Copy link
Member Author

Wait, Reverse uses foreach_reverse to build the list by appending. I'll close this, sorry for the distraction.

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.

2 participants

Comments