För att uppnå en asymptotisk prestanda av O n som den handkodade lösningen kan du använda Aggregate-funktionen som i. Det ackumulerade värdet som implementeras som anonym typ innehåller två fält Resultat innehåller resultatlistan uppbyggd hittills Arbeta innehåller den sista Period 1-element Den aggregerade funktionen lägger till det nuvarande värdet i arbetslistan, bygger nuvarande medelvärde och lägger till det i resultatet och tar sedan bort det första, dvs äldsta värdet från arbetslistan. Fröet, dvs startvärdet för ackumuleringen är byggd Genom att lägga de första periodens 1-element i Arbeta och initialisera Resultat till en tom lista. Följaktligen börjar aggregeringen med elementperiod genom att hoppa över period-1-element i början. I funktionell programmering är detta ett typiskt användningsmönster för aggregerings - eller vikningsfunktionen , Btw. Lösningen är inte funktionellt ren eftersom samma listobjekt Arbete och resultat återanvänds i varje steg Jag är inte säker på om det kan orsaka problem om så Mig framtida kompilatorer försöker parallellisera Aggregate-funktionen automatiskt å andra sidan Jag är inte heller säker, om det är möjligt, trots allt En rent funktionell lösning ska skapa nya listor vid varje steg. Observera också att C saknar kraftfulla uttrycksuttryck I någon hypotetisk Python - C-blandad pseudokod man kunde skriva aggregeringsfunktionen som. som skulle vara lite mer elegant i min ödmjuka åsikt. Notera löptiden för O n 2 eftersom du behöver hoppa över fler och fler element vid varje steg och afaik Hoppa över har jag Att ringa i tider Se mitt svar för en lösning i tiden jag bara märkte OP-kommentaren nedan att han kanske kommer att få värden från en SQL DB i framtiden I det här fallet skulle jag alla starkt avskräcka från den här lösningen MartinStettner Mar 3 11 vid 0 53. För det effektivaste sättet att beräkna ett rörligt medelvärde med LINQ, ska du inte använda LINQ. Istället föreslår jag att du skapar en hjälparklass som beräknar ett glidande medelvärde på bästa möjliga sätt med hjälp av ac Cirkulär buffert och kausalt rörligt medelfilter, sedan en förlängningsmetod för att göra den tillgänglig för LINQ. First up, det rörliga genomsnittet. Denna klass ger en mycket snabb och lätt implementering av ett MovingAverage-filter. Det skapar en cirkulär buffert av längd N och beräknar en Lägg till, en subtrahera och en multiplicera per datapunkt som bifogas, i motsats till N multiplicera-adds per punkt för brute force implementation. The ovanstående förlängningsmetoder sätter in MovingAverage-klassen och tillåter införande i en IEnumerable stream. To göra detta i en Mer funktionellt sätt, du behöver en skanningsmetod som finns i Rx men inte i LINQ. Låt oss se hur det skulle se ut om vi skulle ha en skanningsmetod. Och här är skanningsmetoden som tas och justeras härifrån. Har bättre prestanda än brute force-metoden eftersom vi använder en löpande summa för att beräkna SMA. För att starta måste vi beräkna den första perioden som vi kallar frö här. Sedan beräknar vi varje efterföljande värde från det ackumulerade fröet va lue För att göra det behöver vi det gamla värdet som är t-delta och det nyaste värdet för vilket vi slår samman serien, en gång från början och en gång förskjutet av deltaet. I slutet gör vi en del rengöring genom att lägga till nollor för längden Av den första perioden och lägger till det ursprungliga frövärdet. Svarade den 19 juni kl. 22 58. Mitt mål är att få ett vägt genomsnitt från ett bord baserat på en annan primärnyckel. Jag behöver få ett vägt genomsnitt baserat på längden på Ett segment och jag måste ignorera värdena på -1 Jag vet hur man gör det i SQL, men mitt mål är att göra detta i LINQ Det ser något ut i SQL. Jag är fortfarande ganska ny på LINQ och har svårt räkna ut hur jag skulle översätta detta Resultatet vägde genomsnittet skulle komma ut till ungefär 55 3 Tack. asked 26 april 10 vid 15 23.Jag gör det nog för att jag skapade en förlängningsmetod för LINQ. När du får din delmängd av data samtal ser ut så här. Detta har blivit extremt praktiskt eftersom jag kan få ett vägt genomsnitt för varje grupp av data ba sed på ett annat fält inom samma post. Jag kontrollerar nu att dela med noll och släng ett mer detaljerat undantag istället för att returnera 0 Låt användaren fånga undantaget och hantera efter behov. Jag har en 4000 mängd data på lager och tring att beräkna det glidande medlet för alla datavärden, men eftersom det rörliga genomsnittet är baserat på tidigare data och jag kan inte beräkna 15-dagars SMA under de första 14 dagarna, hoppa över de första 14 dagarna och beräkna SMA på resten av data Och det Är måste använda LINQ för att åstadkomma Kan någon ge ett prov eller tips om hur man använder LINQ för att beräkna glidande medelvärdet Utgången för genomsnittsvärdena är runt 500 så kan jag verkligen inte förstå hur det är möjligt att få det höga värdet. Moving averager Med summan array 06 07 2012 562 49 571 72.06 08 2012 565 84 580 32.06 11 2012 568 56 571 17.06 12 2012 569 55 576 16.06 13 2012 570 56 572 16.06 14 2012 570 63 571 53.06 15 2012 571 21 574 13.06 18 2012 572 78 585 78,06 19 2012 573 79 587 41,06 20 2012 574 23 585 74,06 21 2012 574 22 577 67,06 22 2012 575 63 582 10,06 25 2012 576 06 570 77,06 26 2012 576 68 572 03.06 27 2012 576 88 574 50.06 28 2012 576 7 569 05.06 29 2012 576 95 584 00.07 02 2012 578 37 592 52,07 03 2012 579 92 599 41.07 03 2012 581 74 599 41.Edited av Leemx fredagen den 16 november 2012 2 59 AM. Moved av Lisa Zhu Microsoft kontingentpersonal måndag 19 november 2012 7 38 AM Linq relaterade Från Visual C General. Friday , 16 november 2012 2 42 AM. För att skapa ett glidande medelvärde, skulle jag börja med att skapa ett intervall från 0 till längden av datalistan - längden på rörelseperioden, sedan för varje värde i intervallet välj element x till x längd för rörelse Period och beräkna genomsnittet. Allt i ett fint LINQ-meddelande. Notera att detta inte är extremt effektivt, eftersom du i grund och botten repeterar över datalistan för varje värde i intervallet. Se, titta Detta system tillåter signaturer på mer än 60 cha. Edited av Arno Brouwer Fredagen den 23 november 2012 4 42 PM. Markerad som svar från Alexander Sun fredag den 30 december 7, 2012 2 44 AM. Friday, 23 november, 2012 4 41. Alla svar. Ett urval av ditt LINQ-uttalande skulle hjälpa. Perfekt optimering är roten till allt ont - Knuth. För att skapa ett glidande medelvärde skulle jag börja med Skapa ett intervall från 0 till längden av datalistan - längden på rörelseperioden och sedan för varje värde i intervallet välj element x till x längd för rörelseperiod och beräkna medelvärdet. Allt i ett fint LINQ-meddelande. Notera att detta inte är extremt Effektiv, eftersom du i grund och botten repeterar över datalistan för varje värde i intervallet. Se, se Detta system tillåter signaturer på mer än 60 cha. Edited av Arno Brouwer fredagen den 23 november 2012 4 42 PM. Markerat som svar från Alexander Sun Fredag den 7 december 2012 2 44 AM. Friday den 23 november 2012 4 41.Microsoft genomför en online-undersökning för att förstå din åsikt om Msdn-webbplatsen Om du väljer att delta kommer onlineundersökningen presenteras för dig när Du lämnar Msdn-webbplatsen. Vill du delta. Hjälp oss att förbättra MSDN. Visa vår UserVoice-sida att skicka in och rösta på idéer. Centra. Lära resurser.
No comments:
Post a Comment