рдХреЛрдЯрд▓рд┐рди рдХреА рдПрдХ рдорд╣рд╛рди рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреБрдЫ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
рдХреЛрдЯрд▓рд┐рди рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЙрди рд╕рд░реНрд╡реЛрддреНрддрдо рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЫрд╛рддреНрд░рд╡реГрддреНрддрд┐ рдХреЗ рдкрд╛рддреНрд░ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Student
рдореЙрдбрд▓ рд╣реИрдВ:
class Student( val name: String, val surname: String, val passing: Boolean, val averageGrade: Double )
рдЕрдм рд╣рдо рд╕рднреА рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢реАрд░реНрд╖ рджрд╕ рдЫрд╛рддреНрд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
students.filter { it.passing && it.averageGrade > 4.0 } // 1 .sortedBy { it.averageGrade } // 2 .take(10) // 3 .sortedWith(compareBy({ it.surname }, { it.name })) // 4
- рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд░реАрдХреНрд╖рд╛ рдЙрддреНрддреАрд░реНрдг рдХреА рд╣реИ, рдЬрд┐рдирдХрд╛ рдФрд╕рдд рд╕реНрдХреЛрд░ 4.0 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред
- рдФрд╕рдд рд╕реНрдХреЛрд░ рджреНрд╡рд╛рд░рд╛ рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВред
- рд╣рдо рдкрд╣рд▓реЗ рджрд╕ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред
- рдЙрдиреНрд╣реЗрдВ рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВред рддреБрд▓рдирд┐рддреНрд░ рдкрд╣рд▓реЗ рдЕрдВрддрд┐рдо рдирд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рд╡реЗ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдпрд╣ рдирд╛рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░, рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рдХреНрд░рдо рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рдореВрд▓ рдХреНрд░рдо рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рд╣рдо рдЗрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
students.filter { it.passing && it.averageGrade > 4.0 } .withIndex() // 1 .sortedBy { (i, s) -> s.averageGrade } // 2 .take(10) .sortedBy { (i, s) -> i } // 3 .map { (i, s) -> s } // 4
- рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЛ рдмрд╛рдВрдзреЗрдВред
- рдФрд╕рдд рдЕрдВрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЫрд╛рдБрдЯреЗрдВ рдФрд░ рдкрд╣рд▓реЗ рджрд╕ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред
- рдлрд┐рд░ рд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ред
- рд╣рдо рдЗрдВрдбреЗрдХреНрд╕ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рддрдирд╛ рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рд╣реИред

рдпрджрд┐ рдЖрдкрдиреЗ рдПрдХ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдмреАрдЬрдЧрдгрд┐рдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реБрдкрд░рд╕реЗрдЯ рдХреНрдпрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП, рдЙрд╕рдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рдЙрд╕рдХреЗ рд╕рднреА рд╕рдмрд╕реЗрдЯ рдХрд╛ рд╕реЗрдЯ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рд╕реЗрдЯ рдФрд░ рдЦрд╛рд▓реА рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рд╕реЗрдЯ рд╣реИрдВ:
{1,2,3}
рд╡рд╣ рдЙрдирдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рд╣реИ:
{{}, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}}
рдмреАрдЬрдЧрдгрд┐рдд рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ?
рдЕрдЧрд░ рдЖрдк рдЦреБрдж рдХреЛ рдЪреБрдиреМрддреА рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрднреА рд╕реЗ рдкрдврд╝рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦреБрдж рд╕реБрд▓рдЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢реБрд░реВ рдХрд░реЗрдВред рдпрджрд┐ рд╣рдо рд╕реЗрдЯ рдХреЗ рдХреБрдЫ рддрддреНрд╡ рд▓реЗрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1), рддреЛ рд╕реБрдкрд░-рд╕реЗрдЯ рдореЗрдВ рдЗрд╕ рддрддреНрд╡ рдХреЗ рдмрд░рд╛рдмрд░ рд╕реЗрдЯ рд╣реЛрдВрдЧреЗ ({1}, {1,2}, {1,3}, {1,2,3}) рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ ({}, {2}, {3}, {2,3})ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреВрд╕рд░рд╛ рд╕реЗрдЯ рдПрдХ рд╕реБрдкрд░-рд╕реЗрдЯ ({2,3}) рд╣реИ, рдФрд░ рдкрд╣рд▓рд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рддрддреНрд╡ (1) рдХреЗ рд╕рд╛рде рдПрдХ рд╕реБрдкрд░-рд╕реЗрдЯ ({2,3}) рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рд▓реЗ рдХрд░ рд╕реБрдкрд░рд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдпреЛрдЧ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд╣рд▓реЗ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
fun <T> powerset(set: Set<T>): Set<Set<T>> { val first = set.first() val powersetOfRest = powerset(set.drop(1)) return powersetOfRest.map { it + first } + powersetOfRest }
рд▓реЗрдХрд┐рди рдпрд╣ рддрд░реАрдХрд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рд╕рдорд╕реНрдпрд╛ рдПрдХ рдЦрд╛рд▓реА рд╕реЗрдЯ рд╣реИ: first
рд╕реЗрдЯ рдЦрд╛рд▓реА рд╣реЛрдиреЗ рдкрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред рдпрд╣рд╛рдВ рдПрдХ рд╕реБрдкрд░рд╕реЗрдЯ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддреА рд╣реИ - рдПрдХ рдЦрд╛рд▓реА рд╕реЗрдЯ рдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рдПрдХ рдЦрд╛рд▓реА рд╕реЗрдЯ рд╣реИ: рдкрд╛рд╡рд░рд╕реЗрдЯ ({}) = {{}}ред рдпрд╣рд╛рдБ рд╕рд╣реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
fun <T> powerset(set: Set<T>): Set<Set<T>> = if (set.isEmpty()) setOf(emptySet()) else { val powersetOfRest = powerset(set.drop(1)) powersetOfRest + powersetOfRest.map { it + set.first() } }

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рдкреЙрд╡рд░рд╕реЗрдЯ ({1,2,3}) рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛:
рдкрд╛рд╡рд░рд╕реЗрдЯ ({1,2,3}) = рдкрд╛рд╡рд░рд╕реЗрдЯ ({2,3}) + рдкрд╛рд╡рд░рд╕реЗрдЯ ({2,3})ред рдореИрдк {рдпрд╣ + 1}}
рдкрд╛рд╡рд░рд╕реЗрдЯ ({2,3}) = рдкрд╛рд╡рд░рд╕реЗрдЯ ({3}) + рдкрд╛рд╡рд░рд╕реЗрдЯ ({3})ред рдореИрдк {рдЗрдЯ + 2}
рдкрд╛рд╡рд░рд╕реЗрдЯ ({3}) = рдкрд╛рд╡рд░рд╕реЗрдЯ ({}) + рдкрд╛рд╡рд░рд╕реЗрдЯ ({})ред рдореИрдк {рдЗрдЯ + 3}
рдкрд╛рд╡рд░рд╕реЗрдЯ ({}) = {{}}
рдкреЙрд╡рд░рд╕реЗрдЯ ({3}) = {{}, {3}}
рд╢рдХреНрддрд┐рдпреЛрдВ ({2,3}) = {{}, {3}} + {2}, {2, 3}} = {{}, {2}, {3}, {2, 3}}
рдкрд╛рд╡рд░рд╕реЗрдЯ ({1,2,3}) = {{}, {2}, {3}, {2, 3}} + {{1}, {1, 2}, {1, 3}, {1 2, 3}} = {{}, {1}, {2}, {3}, {1,2}, {1,3}, {2,3}, {1,2,3}}
рд▓реЗрдХрд┐рди рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдиреЛрдЯреЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреЛрдЯреЗрд╢рди рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВ:
fun <T> powerset(set: Set<T>): Set<Set<T>> = if (set.isEmpty()) setOf(emptySet()) else powerset(set.drop(1)) .let { it+ it.map { it + set.first() }
рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ Collection
рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ Set
( setOf(1,2,3).powerset()
powerset(setOf(1,2,3))
рдмрдЬрд╛рдп powerset(setOf(1,2,3))
):
fun <T> Collection<T>.powerset(): Set<Set<T>> = if (isEmpty()) setOf(emptySet()) else drop(1) .powerset() .let { it+ it.map { it + first() }
рд╣рдо рдмрдирд╛рдИ рдЧрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рднреА рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрд░реЛрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╕реБрдкрд░рд╕реЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдмрдврд╝рддреА рд╣реИ (рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗ рд╕рд╛рде), рдХреНрдпреЛрдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рд▓реВрдк рдпрд╛ tailrec
рдлрд╝рдВрдХреНрд╢рди tailrec
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрдардиреАрдпрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред tailrec
рд╕рдВрд╢реЛрдзрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЗрди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ:
fun <T> Collection<T>.powerset(): Set<Set<T>> = powerset(this, setOf(emptySet())) private tailrec fun <T> powerset(left: Collection<T>, acc: Set<Set<T>>): Set<Set<T>> = if (left.isEmpty()) acc else powerset(left.drop(1), acc + acc.map { it + left.first() })
рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди KotlinDiscreteMathToolkit рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдЕрд╕рддрдд рдЧрдгрд┐рдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдордпред рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╢реИрд▓реА рдФрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЬрдЯрд┐рд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдПрдХ рддреНрд╡рд░рд┐рдд рд╕реЙрд░реНрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реИ: рд╣рдо рдХреБрдЫ рддрддреНрд╡ (рдзреБрд░реА (рд░реВрд╕реА рдмрд╛рд░ )) рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреНрдп рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рд╕реВрдЪреА рдЬрд┐рд╕рдореЗрдВ рдмрд╛рд░ рдФрд░ рдЫреЛрдЯреЗ рд╕реЗ рдмрдбрд╝реЗ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдЗрди рд╕рдмрд╕рд░реНрд╕реЗрд╕ рдХреЛ рдкреБрди: рдЯрд╛рдЗрдк рдХрд░рддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рд╣рдо рдЫреЛрдЯреЗ рддрддреНрд╡реЛрдВ, рдПрдХ рдмрд╛рд░ рдФрд░ рдмрдбрд╝реЗ рддрддреНрд╡реЛрдВ рдХреА рдХреНрд░рдордмрджреНрдз рд╕реВрдЪреА рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВред рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рдПрдХ рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдВред рдпрд╣рд╛рдБ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ:
fun <T : Comparable<T>> List<T>.quickSort(): List<T> = if(size < 2) this else { val pivot = first() val (smaller, greater) = drop(1).partition { it <= pivot} smaller.quickSort() + pivot + greater.quickSort() }
рдмрд╣реБрдд рдЦреВрдмрд╕реВрд░рдд рд▓рдЧ рд░рд╣реА рд╣реИ, рд╣реИ рдирд╛? рдпрд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╕реБрдВрджрд░рддрд╛ рд╣реИред

рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рд╣реИред рд╡рд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕рдВрдпрдорд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЫреЛрдЯрд╛ рдФрд░ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдирд╛? рдЖрдЗрдП рдЗрди рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдЖрдЗрдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:
val r = Random() listOf(100_000, 1_000_000, 10_000_000) .asSequence() .map { (1..it).map { r.nextInt(1000000000) } } .forEach { list: List<Int> -> println("Java stdlib sorting of ${list.size} elements took ${measureTimeMillis { list.sorted() }}") println("quickSort sorting of ${list.size} elements took ${measureTimeMillis { list.quickSort() }}") }
рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдорд┐рд▓реЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
100000 рддрддреНрд╡реЛрдВ рдХреА рдЫрдВрдЯрдиреА рдХреА рдЬрд╛рд╡рд╛ stdlib 83
резрежрежрежрежреж рддрддреНрд╡реЛрдВ рдХреА рдЫрдБрдЯрд╛рдИ рдХреНрд╡рд┐рдХреЙрд░реНрдЯ рдиреЗ резремрей рд▓реА
1,000,000 рддрддреНрд╡реЛрдВ рдХреА рдЬрд╛рд╡рд╛ stdlib рдЫрдБрдЯрд╛рдИ 558 рд╣реБрдИ
1,000,000 рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдХреНрд╡рд┐рдХрд╕реЙрд░реНрдЯ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдореЗрдВ 859 рд▓рдЧреЗ
рдЬрд╛рд╡рд╛ stdlib 10,000,000 рддрддреНрд╡реЛрдВ рдХреА рдЫрдВрдЯрдиреА рдиреЗ 6182 рд▓рд┐рдпрд╛
резреж,режрежреж,режрежреж рддрддреНрд╡реЛрдВ рдХреА рдХреНрд╡рд┐рдХрд╕реЙрд░реНрдЯ рдЫрдБрдЯрд╛рдИ резреирезрейрей рд╣реБрдИ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, quickSort
рдлрд╝рдВрдХреНрд╢рди рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИред рд╡рд┐рд╢рд╛рд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреАред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрдВрддрд░ рдЖрдорддреМрд░ рдкрд░ 0.1ms рд╕реЗ 0.2ms рддрдХ рд╣реЛрдЧрд╛ред рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдереЛрдбрд╝рд╛ рдХрдо рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдп рдФрд░ рд╕рд░рд▓ рд╣реИред