Алгоритм Джарвіса

Алгоритм Джарвіса (або алгоритм загортання подарунка) — алгоритм знаходження опуклої оболонки. Часова складність — О(n * h), де n — кількість точок, h — кількість точок опуклої оболонки. Тобто, алгоритм найбільш ефективний у випадку малої кількості точок опуклої оболонки.

Опис алгоритму

Нехай шукана опукла оболонка множини точок. Як початкову беремо найлівішу точку (точку з найменшою x-координатою), якщо їх буде декілька, то виберемо серед них найнижчу (точку з найменшою y-координатою). Нехай знайдена точка — точка (її можна знайти за час звичайним проходом по всіх точках і порівнянням координат). Точка напевно є вершиною опуклої оболонки. Далі для кожної точки шукаємо проти годинникової стрілки точки шляхом знаходження за серед точок, що залишились, (включно з ) точку з найменшим полярним кутом . Вона і буде наступною вершиною опуклої оболонки. При цьому не обов'язково обчислювати кут — достатньо обчислити векторний добуток (узагальненням векторного добутку для двовимірного випадку є псевдоскалярний добуток) між векторами та , де  — знайдений на даний момент мінімум,  — претендент (першим мінімумом може бути обрана довільна точка). Якщо векторний добуток від'ємний, то знайдено новий мінімум. Якщо рівний нулю, тобто та лежать на одній прямій, то мінімум — та, яка лежить далі від точки . Алгоритм продовжує роботу доки . Чому алгоритм зупиниться? Тому, що точка (найнижча серед найлівіших точок) у будь-якому випадку належить до точок опуклої оболонки.

Псевдокод

Jarvis(P)
    1) p[1] = найнижча серед найлівіших точок множини P;
    2) i = 1;
    3) do:
         p[i+1] = довільна точка з P (крім вже зарахованих до опуклої оболонки, але включно з p[1]);
             (a)for (для кожної точки j з P, крім вже зарахованих до опуклої оболонки, але включно з p[1]
                 p[i+1] = min_polar_angle(p[i+1], P[j]); // мінімум через векторний добуток
             (b)i = i + 1;
       while p[i] != p[1]
    4) return p;


Реалізація на С++

 
//Point - some type that has x, y members and
//for which operator != is defined
template <typename Point>
inline bool determinantSignum(const Point& a,
                              const Point& b,
                              const Point& c)
{
    return (((b.x - a.x) * (c.y - b.y) -
             (c.x - b.x) * (b.y - a.y)) >= 0);
}

template <typename Point>
void jarvis(const std::vector<Point> & source,
            std::vector<Point>& result)
{
    if (source.empty())
    {
        return;
    }

    std::vector<Point> src = source;
    typedef typename std::vector<Point>::iterator PointIterator;
    PointIterator leftDownIt = src.begin();
    PointIterator it = leftDownIt + 1;
    Point currentPoint;
    Point leftDownPoint = *(leftDownIt);

    // Finding leftest lowest point

    for (PointIterator end = src.end(); it != end; ++it)
    {
        currentPoint = *it;
        if (currentPoint.x < leftDownPoint.x)
        {
            leftDownPoint = currentPoint;
            leftDownIt = it;
        }
        else if (currentPoint.x == leftDownPoint.x
                 && currentPoint.y < leftDownPoint.y)
        {
            leftDownPoint = currentPoint;
            leftDownIt = it;
        }
    }

    // Add selected point to answer
    src.erase(leftDownIt);
    result.push_back(leftDownPoint);

    currentPoint = leftDownPoint;

    Point nextPoint, tryPoint;
    PointIterator nextIt;

    do
    {
        nextPoint = leftDownPoint;
        nextIt = it;
        it = src.begin();
        for (PointIterator end = src.end(); it != end; ++it)
        {
            tryPoint = *it;
            if (determinantSignum(nextPoint,
                                  currentPoint,
                                  tryPoint))
            {
                nextPoint = tryPoint;
                nextIt = it;
            }
        }

        if (nextPoint != leftDownPoint)
        {
            src.erase(nextIt);
            result.push_back(nextPoint);
            currentPoint = nextPoint;
        }

    }
    while (nextPoint != leftDownPoint);
}

Див. також

Посилання

Література

Read other articles:

5e Etappe – 8 mei 2013 Cosenza – Matera vlakke rit over 203 km Etappe-uitslag John Degenkolb 4u37'48 2e Ángel Vicioso z.t. 3e Paul Martens z.t. 8e Jens Keukeleire z.t. 26e Wilco Kelderman z.t. Algemeen klassement Luca Paolini 19u56'39 2e Rigoberto Urán + 17 3e Beñat Intxausti + 26 12e Robert Gesink + 45 41e Francis De Greef + 3'03 Portaal    Wielersport De vijfde etappe van de Ronde van Italië 2013 werd gereden op 8 mei. Het ging om een vlakke rit over 203 kilometer van Cose...

 

Зникний спрей — речовина, що застосовується у спортивних змаганнях, переважно в футболі, щоб намалювати тимчасову лінію для користування гравцями та суддею з метою забезпечення чесної гри. Спрей наноситься з аерозольного балону та виглядає як біла пляма або лінія, як...

 

La música de Rusia es la música típica de los pueblos y etnias que han poblado el país. Por lo tanto, incluye tanto el folklore tradicional ruso como el propio de las minorías étnicas que han habitado la Federación Rusa y sus estados antecesores: los principados rusos medievales, en el Imperio ruso y la Unión Soviética. Historia Principados rusos Entre las tradiciones musicales de los principados rusos medievales destacaba la de la República de Novgorod, un estado situado en torno a...

Ehemaliger Kanton Marseille-Saint-Barthélemy Region Provence-Alpes-Côte d’Azur Département Bouches-du-Rhône Arrondissement Marseille Auflösungsdatum 29. März 2015 Einwohner 41.363 (1. Jan. 2012) Bevölkerungsdichte 2.980 Einw./km² Fläche 13.88 km² Gemeinden 1 INSEE-Code 1345 Lage des Kantons Marseille-Saint-Barthélemy im Département Bouches-du-Rhône Der Kanton Marseille-Saint-Barthélemy war bis 2015 ein französischer Wahlkreis im Arrondissement Marseille, i...

 

  بويرتو نتالز (بالإسبانية: Puerto Natales)‏    بويرتو نتالز تاريخ التأسيس 1911  تقسيم إداري البلد تشيلي  [1] عاصمة لـ Última Esperanza Province [الإنجليزية]‏، وNatales [الإنجليزية]‏ خصائص جغرافية إحداثيات 51°43′35″S 72°30′22″W / 51.7263°S 72.5062°W / -51.7263; -72.5062  المساح...

 

Ongoing crime in Japan A Japanese Police car Crime in Japan has been recorded since at least the 1800s, and has varied over time.[1] History Main article: Criminal justice system of Japan Before the Meiji Era, crime was handled often severely at a daimyo level. Yakuza Main article: Yakuza The yakuza existed in Japan well before the 1800s and followed codes similar to the samurai. Their early operations were usually close-knit, and the leader and his subordinates had father-son relatio...

American comedy-drama web series The correct title of this article is #Adulting. The omission of the # is due to technical restrictions. #AdultingCreated byBen Baur Thandi TolmayWritten by Ben Baur Thandi Tolmay Zac Hug Directed byTJ MarchbankStarringBen Baur Thandi TolmayTheme music composerGregory NaboursCountry of originUnited StatesOriginal languageEnglishNo. of seasons2No. of episodes9 (list of episodes)ProductionExecutive producersBen BaurThandi TolmayCinematographyMatt Miller (season t...

 

For other uses, see Some Girls (disambiguation). 1978 studio album by the Rolling StonesSome GirlsStudio album by the Rolling StonesReleased9 June 1978 (1978-06-09)Recorded10 October 1977 – 2 March 1978StudioPathé Marconi (Paris)Genre Rock hard rock[1] punk rock[2] disco[2] new wave[3] Length40:45LabelRolling StonesProducerThe Glimmer TwinsThe Rolling Stones chronology Love You Live(1977) Some Girls(1978) Time Waits for No One: Antholo...

 

Not to be confused with Inverkeithing. Inverkeithny School Inverkeithny is a village in the Formartine area of Aberdeenshire, Scotland. The village lies near where the Burn of Forgue flows into the River Deveron, 7 miles (11 km) west of Turriff and 3 miles (5 km) south-east of Aberchirder. In 1990, it was described by Charles McKean as near-deserted.[1] Netherdale House, an Italianate mansion on a bluff high above the river, was built in 1774,[1] while Muiresk House ...

Minister Jan Vijoen Johannes Hendrikus Viljoen (15 October 1893 – 5 December 1957) was a South African politician, member of parliament for the constituencies of Hoopstad (1933-1941) and Vryburg (1948-1957), Minister of Mines (1950-1953), Education, Arts and Sciences (1950-1957), Social Affairs (1953-1954), Forestry (1954-1956) and Health (1956-1957) in both Daniel François Malan's and Johannes Gerhardus Strijdom's cabinets. Political career Viljoen was the son of JH (Jan) Viljoen (1869-19...

 

مستشفى الطوارئ بأبو خليفة للجراحات الدقيقة إحداثيات 30°44′35″N 32°15′34″E / 30.742925509298°N 32.259447890586°E / 30.742925509298; 32.259447890586  معلومات عامة الدولة مصر  معلومات أخرى تعديل مصدري - تعديل   مستشفى أبو خليفة للطوارئ والجراحات المتخصصة هي مستشفي في الإسماعيلية، الإسماعي...

 

2016 Élections législatives de 2021 aux îles Turques-et-Caïques 15 des 21 sièges de l'Assemblée 19 février 2021 Corps électoral et résultats Inscrits 8 581 Votants 6 460   76,74 %  3,7 Blancs et nuls 0 Parti national progressiste – Washington Misick Voix 17 105 56,25 %   20,9 Sièges obtenus 14  9 Mouvement démocratique populaire – Sharlene Cartwright-Robinson Voix 12 127 39,88 %   7,4 Si...

American hip-hop choreographer (born 1969) This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This biography of a living person needs additional citations for verification. Please help by adding reliable sources. Contentious material about living persons that is unsourced or poorly sourced must be removed immediately from the article and its talk page, especially if potentially libelous.Find...

 

Novel by Douglas Preston and Lincoln Child This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Mount Dragon – news · newspapers · books · scholar · JSTOR (November 2013) (Learn how and when to remove this template message) Mount Dragon AuthorDouglas Preston,Lincoln ChildCountryUnited StatesLanguageEnglishGenreTechno-thrillerPubli...

 

British electric passenger train British Rail Class 350DesiroLondon Northwestern Railway Class 350 at Watford JunctionRefurbished standard-class interior of a Class 350/1 unitIn serviceJune 2005 – presentManufacturerSiemens Transportation SystemsBuilt atKrefeld, GermanyFamily nameDesiroReplacedClass 153Class 170Class 319Class 321Constructed 2004–2005 (350/1)[1] 2008–2009 (350/2)[2] 2013–2014 (350/3 and /4)[3] Number built87SuccessorClass 397Class 7...

Primeira Liga Experimental 1936-1937 Competizione Primeira Liga Sport Calcio Edizione 3ª Organizzatore FPF Date dal 10 gennaio 1937al 2 maggio 1937 Luogo  Portogallo Partecipanti 8 Cronologia della competizione 1935-36 1937-38 Manuale L'edizione 1936-37 della Primeira Liga Experimental vide la vittoria finale del Benfica. La competizione era a inviti, 4 da Lisbona, 2 da Porto, una da Setubal e una da Coimbra. Capocannoniere del torneo fu Soiero (Sporting CP), con 24 reti. Indice...

 

Airline Aeroflot-Cargo DivisionАэрофлот-Карго IATA ICAO Callsign SU RCF AEROFLOT CARGO Founded1995Ceased operationsApril 5, 2010 (2010-04-05) (Merged with Aeroflot)HubsSheremetyevo International AirportAllianceSkyTeam CargoFleet size3Destinations11Parent companyAeroflotHeadquartersMoscow, RussiaKey peopleOleg Konstantinovich Korolev (General Director)Websitewww.aeroflot.ru CJSC Aeroflot-Cargo (Russian: Аэрофлот-Карго) was a fully owned subsidiary of Ae...

 

Madonna videographyMadonna performing Bitch I'm Madonna at the Rebel Heart Tour (2015–2016). The song's music video became her first clip to cross 100 million views on platform Vevo.[1]Music videos78Concert tour videos11Documentary videos2Music video compilations4Music video box sets2Promotional video albums4Video singles4 American singer Madonna has released 78 music videos, eleven concert tour videos, two documentary videos, four music video compilations, two music video box sets,...

Academic journalApplied LinguisticsDisciplineApplied linguisticsLanguageEnglishEdited byChristina HigginsPublication detailsHistory1980–presentPublisherOxford University PressFrequencyQuarterlyImpact factor5.741 (2020)Standard abbreviationsISO 4 (alt) · Bluebook (alt1 · alt2)NLM (alt) · MathSciNet (alt )ISO 4Appl. Linguist.IndexingCODEN (alt · alt2) · JSTOR (alt) · LCCN (alt)MIAR · NLM (a...

 

Вера Циривиримак. Вера Циривири Народилася 1920Прилеп, Королівство Сербів, Хорватів і СловенцівПомерла 14 липня 1944(1944-07-14)Штип, Третє Болгарське царствоГромадянство Королівство ЮгославіяБрати, сестри Branka Ciriviri-Antonovskad Вера Циривири (мак. Вера Циривири — Трена; 1920 році, При...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!